Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server:jak wybrać kontakty pierwszego, drugiego i trzeciego stopnia

Możesz użyć EXCEPT operatora.

Kontakty pierwszego stopnia:

SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'

Kontakty drugiego stopnia, które nie są kontaktami pierwszego stopnia:

SELECT
  contactB.contact_2
FROM 
  contact AS contactB
  INNER JOIN contact AS contactA ON contactA.contact_2=contactB.contact_1
WHERE contactA.contact_1 = 'gulsah'
EXCEPT
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'

EXCEPT nakazuje serwerowi SQL zwrócić wszystkie wyniki z pierwszego SELECT które NIE pojawiają się w drugim SELECT .

W przypadku kontaktów trzeciego stopnia (które nie są kontaktami pierwszego ani drugiego stopnia):

SELECT
  contactC.contact_2
FROM 
  contact AS contactC
  INNER JOIN contact AS contactB ON contactB.contact_2=contactC.contact_1
  INNER JOIN contact AS contactA ON contactA.contact_2=contactB.contact_1
WHERE contactA.contact_1 = 'gulsah'
EXCEPT
(
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
UNION
SELECT
  contactB.contact_2
FROM 
  contact AS contactB
  INNER JOIN contact AS contactA ON contactA.contact_2=contactB.contact_1
WHERE contactA.contact_1 = 'gulsah'
)

Nie wiążę wielkich nadziei z wydajnością, ale oczywiście musisz to sprawdzić sam.

Na marginesie:

I can select mutual contacts but I guess it is not the right approach.

Użyj INTERSECT w tym celu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Plan wykonania widoku partycjonowanego

  2. Podzapytanie programu SQL Server zwróciło więcej niż 1 wartość. Nie jest to dozwolone, gdy podzapytanie następuje po =, !=, <, <=,>,>=

  3. Funkcje ciągów T-SQL:różnica między używaniem Left/Right i Substring a dziwnym zachowaniem

  4. Jak wybrać indeks klastrowy w SQL Server?

  5. SQL Group BY, Top N pozycji dla każdej grupy