Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server:come selezionare i contatti di Primo, Secondo e Terzo grado

Potresti usare EXCEPT operatore.

Contatti di primo grado:

SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'

Contatti di secondo grado che non sono contatti di primo grado:

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 dice al server SQL di restituire tutti i risultati dal primo SELECT che NON compaiono nel secondo SELECT .

Per i contatti di terzo grado (che non sono contatti di primo o secondo grado):

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'
)

Non nutro grandi speranze per le prestazioni, ma ovviamente dovrai verificarlo tu stesso.

Come nota a margine:

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

Usa INTERSECT per questo.