Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server :comment sélectionner des contacts de premier, deuxième et troisième degré

Vous pouvez utiliser le EXCEPT opérateur.

Contacts au premier degré :

SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'

Contacts au second degré qui ne sont pas des contacts au premier degré :

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 indique au serveur SQL de renvoyer tous les résultats du premier SELECT qui n'apparaissent PAS dans le second SELECT .

Pour les contacts au troisième degré (qui ne sont pas des contacts au premier ou au deuxième degré) :

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

Je n'ai pas de grands espoirs pour les performances, mais bien sûr, vous devrez vérifier cela vous-même.

En remarque :

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

Utilisez INTERSECT pour cela.