Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server:como selecionar contatos de primeiro, segundo e terceiro grau


Você pode usar o EXCEPT operador.

Contatos de primeiro grau:
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'

Contatos de segundo grau que não são contatos de primeiro grau:
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 diz ao servidor SQL para retornar todos os resultados do primeiro SELECT que NÃO aparecem no segundo SELECT .

Para contatos de terceiro grau (que não são contatos de primeiro ou segundo grau):
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'
)

Não tenho grandes esperanças de desempenho, mas é claro que você precisará verificar isso sozinho.

Como uma nota rodapé:
I can select mutual contacts but I guess it is not the right approach.

Use INTERSECT por esta.