Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server:как да изберете контакти от първа, втора и трета степен

Можете да използвате EXCEPT оператор.

Контакти от първа степен:

SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'

Контакти от втора степен, които не са контакти от първа степен:

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 казва на SQL сървъра да върне всички резултати от първия SELECT които НЕ се появяват във втория SELECT .

За контакти от трета степен (които не са контакти от първа или втора степен):

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

Не възлагам големи надежди за производителност, но разбира се ще трябва да проверите това сами.

Като странична бележка:

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

Използвайте INTERSECT за това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на набор от резултати от подизбор, когато се срещнат дублиращи се редове

  2. Автоматизиране на дефрагментацията на индекса в базата данни на MS SQL Server

  3. MS SQL ping външен сървър

  4. Как да създадете индекс за низова колона в sql?

  5. Sqlcmd:Грешка:Microsoft SQL Server Native Client 10.0:Грешка в комуникационната връзка