sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server:cómo seleccionar contactos de primer, segundo y tercer grado

Podrías usar el EXCEPT operador.

Contactos de primer grado:

SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'

Contactos de segundo grado que no son contactos de primer 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 le dice al servidor SQL que devuelva todos los resultados del primer SELECT que NO aparecen en el segundo SELECT .

Para contactos de tercer grado (que no son contactos de primer o segundo 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'
)

No tengo grandes esperanzas en el rendimiento, pero, por supuesto, deberá comprobarlo usted mismo.

Como nota al margen:

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

Usa INTERSECT por esto.