2013-05-31 13 views
6

SQL Server için ortak olarak arkadaşlarla eşleştirmek için kullanılan bir sorgunun nasıl yazılacağını bulmaya çalışıyorum. İsimler aynı tabloda iki sütun halinde. Sadece "kabul edilen" arkadaşlar iade edilmelidir.SQL Server: Paylaşılan öğeleri 2 sütun halinde bul

ID  Name_1  Name_2  Accepted 
===================================== 
1  Jimmy  John  1 
2  John  Joey  1 
3  Joey  Jimmy  1 
4  John  Sally  1 
5  Jimmy  Sally  0 

Jimmy John ile arkadaş Bu örnekte:

İşte veritabanı bilgisinin bir örnek. Bu iki (ve istenen sonuç) arasındaki paylaşılan arkadaş Joey. Sally her ikisi için de yaygındır, ama Jimmy onu henüz bir arkadaş olarak kabul etmemiştir. Bu çifte öz ile

+0

zaten denedim ne bir örnek var mı? – HABO

cevap

0

A biraz daha az zarif görünümlü, fakat belki daha fazla performans çözüm olabilir:

DECLARE @person1 VARCHAR(50) = 'Jimmy' 
DECLARE @person2 VARCHAR(50) = 'John' 

SELECT FriendsOfP1.Name as MutualFriend 
FROM (SELECT A.name_2 AS Name 
      FROM  friends A 
      WHERE  (A.name_1 = @person1) 
        AND Accepted = 1 
        AND name_2 <> @person2 
      UNION ALL 
      SELECT A.name_1 
      FROM  friends A 
      WHERE  (A.name_2 = @person1) 
        AND Accepted = 1 
        AND name_1 <> @person2) AS friendsOfP1 
INNER JOIN (SELECT A.name_2 AS Name 
      FROM friends A 
      WHERE (A.name_1 = @person2) 
        AND Accepted = 1 
        AND name_2 <> @person1 
      UNION ALL 
      SELECT A.name_1 
      FROM friends A 
      WHERE (A.name_2 = @person2) 
        AND Accepted = 1 
        AND name_1 <> @person1) AS FriendsOfP2 
ON  FriendsOfP1.Name = FriendsOfP2.Name 
+0

İlk kez çalıştı! –

+0

çözümünüzü daha iyi performans gösteriyor. Teşekkürler! –

3

deneyin karşılıklı dostluk katılmak:

SELECT Friend_1, Friend_2, COMMON 
FROM 
(
SELECT f2.NAME_1 AS Friend_1 
     ,f1.NAME_2 AS Friend_2 
     ,f2.Name_2 AS COMMON 
FROM friends f1 
INNER JOIN friends f2 
ON f1.NAME_1 = f2.NAME_2 
WHERE f1.accepted = 1 AND f2.accepted = 1 
) T 
INNER JOIN FRIENDS F3 
ON (F3.Name_1 = Friend_1 AND F3.Name_2 = Friend_2) 
OR (F3.Name_2 = Friend_1 AND F3.Name_1 = Friend_2) 
WHERE F3.ACCEPTED <> 0 AND Friend_1 = 'John' AND Friend_2 = 'Jimmy' 

ORTAK ortak arkadaşıdır.

İlgili SQL Fiddle

Not: Ben bu yapının dostluk ret hakkında, sen karşılıklı dostluk kuralları vardır ilişkisi bu tür tutmak için en iyi olanı olduğundan emin değilim ama bilirdiniz gibi görünüyor Bu bilgiler hakkında hiçbir şey yok. Sadece kısmi bilgileri biliyor musunuz, yoksa depolama sisteminiz/mimariniz bu mu?

+0

Bu çözüm güzel ve kompakttır, ancak ortak arkadaşı bulmak için iki ismi nerede bulabilirim? –

+0

@JohnVanHorn add the value (dış sarma) sorgusunda, kodun veya bir SQL işlevinin parametresinin değerini geçerek AND cümlesi –

İlgili konular