2015-10-07 4 views
0

Я пытаюсь найти 2-й степени дружбы из таблицы (TBL) с 2-мя колонками (пользователь | другу)Вторая степень дружбы SQL - Круговая вопрос дружбы

Я могу перечислить всех друзей, имеющих 2-й степени дружба, но что, если мне нужно исключить тех, кто является первой степенью, я столкнулся с проблемой круговой дружбы

ex.

user | friend 
------------- 
Doge | Cate 

Cate | Narwhal 

Narwhal | Doge 

(и многие другие записи)

с использованием JOIN на тот же стол, установив t1.friend = t2.user, я могу найти все трио, которые соединены через средний человек, но в этом круговом примере дружбы, я могу» t найти способ устранить это. Если у меня есть

Doge | Cate | Narwhal

Cate | Narwhal | Doge

Narwhal | Doge | Cate

как мой результат воздаем, как отфильтровать эту круговую дружбу и исключить его?

ответ

1

Проверьте, если это то, что вы ищете:

DECLARE @TABLE TABLE 
(
[user] VARCHAR(50), 
Friend VARCHAR(50) 
) 

INSERT INTO @TABLE ([user], friend) 
VALUES ('Doge', 'Cate') 

INSERT INTO @TABLE ([user], friend) 
VALUES ('Cate', 'Narwhal') 

INSERT INTO @TABLE ([user], friend) 
VALUES ('Narwhal', 'Doge') 

SELECT u.[user], f.Friend, ff.* 
FROM @TABLE u 
    INNER JOIN @TABLE f   ON U.Friend = f.[user] 
    LEFT OUTER JOIN @TABLE ff ON u.[user] = ff.Friend 
           AND f.Friend = ff.[user] 
WHERE ff.[user] IS NULL 
+1

Это не совсем то, но я понял, что я пропускаю из вашего ответа. Кажется, что я занимаюсь только двумя столами, и мне нужно 3, чтобы проверить круговую дружбу. Второй 'JOIN' решает проблему – JChao

1
SELECT 
    [SecondFriend].user 
FROM tbl [self] 
INNER JOIN tbl [FirstFriend] ON [FirstFriend].user=[self].friend 
INNER JOIN tbl [SecondFriend] ON [SecondFriend].user=[FirstFriend].friend 
    AND [SecondFriend].user <> [self].friend 
WHERE [self].user='Doge' 
Смежные вопросы