Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server:So wählen Sie Kontakte ersten, zweiten und dritten Grades aus

Sie könnten den EXCEPT verwenden Betreiber.

Kontakte ersten Grades:

SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'

Kontakte zweiten Grades, die keine Kontakte ersten Grades sind:

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 weist den SQL-Server an, alle Ergebnisse des ersten SELECT zurückzugeben die NICHT im zweiten SELECT erscheinen .

Für Kontakte dritten Grades (die keine Kontakte ersten oder zweiten Grades sind):

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

Ich habe keine großen Hoffnungen auf Leistung, aber das müssen Sie natürlich selbst überprüfen.

Als Randbemerkung:

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

Verwenden Sie INTERSECT dafür.