sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server:hur man väljer första, andra och tredje gradens kontakter

Du kan använda EXCEPT operatör.

Första gradens kontakter:

SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'

Andra gradens kontakter som inte är första gradens kontakter:

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 säger åt SQL-servern att returnera alla resultat från den första SELECT som INTE visas i den andra SELECT .

För tredje gradens kontakter (som inte är första eller andra gradens kontakter):

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

Jag hyser inga stora förhoppningar om prestanda, men du måste naturligtvis kontrollera detta själv.

Som en sidoanteckning:

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

Använd INTERSECT för detta.



  1. Byt namn på en mysql-procedur

  2. PDO-fel:Ogiltigt parameternummer:parametern har inte definierats

  3. Grundläggande versionskontroll för MySQL-tabell

  4. Rekursiv fråga används för transitiv stängning