我试图从一个表(tbl)找到2级友谊,有2列(用户朋友)
我可以列出所有拥有二级友谊的朋友,但如果我需要排除那些第一学位,我会遇到循环友谊问题
离。
user | friend
-------------
Doge | Cate
Cate | Narwhal
Narwhal | Doge
(以及更多条目)
通过设置JOIN
在同一张桌子上使用t1.friend = t2.user
,我可以找到通过中间人连接的每个三人组,但在这个循环友谊示例中,我无法找到方法消除这一点。如果我有
Doge | Cate | Narwhal
Cate | Narwhal | Doge
Narwhal | Doge | Cate
作为我的推荐结果,如何过滤掉这个循环友谊并排除它?
答案 0 :(得分: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'
答案 1 :(得分: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