SQL查找所有相关条目

时间:2011-12-01 20:19:02

标签: .net sql sql-server-2008 many-to-many data-modeling

拥有用户表,任何用户都可以与其他用户建立友谊。所以,

UserTable
-----------
User1
User2
User3


FriendshipTable
-----------
User1, User3
User2, User5
User3, User5
User5, User9

第1部分:我正在寻找一种方法来获取完整的朋友,朋友的朋友等。例如,User1将返回:User1,User5,User2,User9

第2部分:如果我能够获得最大人口网络的规模,那将是有用的但不是必要的

或者,是否有更好的方法来存储用户之间的连接,这样可以更轻松地提取我需要的信息?就像在建立友谊时建立和合并友谊小组列表一样?

我在这里发现了一些类似的帖子,但是它们似乎都没有跟随网络超越第一层次。

我想那里有解决方案,但我甚至不知道要搜索什么。

1 个答案:

答案 0 :(得分:0)

CTE是这里的方式(但如果你想在朋友之间获得大量的分离度,你需要小心MAXRECURSION)。在您的情况下,UserTable实际上是无关紧要的。你关心的只是关系表(FriendshipTable)。

CREATE TABLE #UserFriendship (User1 VARCHAR(20), User2 VARCHAR(20))

INSERT #UserFriendship VALUES ('A', 'B')
INSERT #UserFriendship VALUES ('B', 'C')


;WITH friends AS
(
    SELECT User1, User2 
    FROM #UserFriendship
    UNION ALL
    SELECT friends.User1, child.User2
    FROM friends
    JOIN #UserFriendship child ON
        friends.User2 = child.User1
)
SELECT * FROM friends