.net SQL查找所有相关条目

.net SQL查找所有相关条目,.net,sql,sql-server-2008,many-to-many,data-modeling,.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 第二部分:如果我能得到最大的人际网络的规模,这将是有用的,但不是必要

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

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


FriendshipTable
-----------
User1, User3
User2, User5
User3, User5
User5, User9
第1部分:我正在寻找一种获取全套朋友、朋友的朋友等的方法。例如,User1将返回:User1、User5、User2、User9

第二部分:如果我能得到最大的人际网络的规模,这将是有用的,但不是必要的

或者,是否有更好的方法来存储用户之间的连接,从而更容易获取我需要的信息?比如在建立友谊的同时建立和合并一个友谊小组的列表

我在这里找到了一些类似的帖子,但似乎没有一篇文章能超越网络的第一个深度


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

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

MSSQL 2008和.NET解决方案不必只有SQL,我想我需要一些临时表和递归。如果是SQL 2K8,您可以使用递归CTE并指定MAXRECUSION选项,无论是0无限还是某些已知限制。FoF可以非常快速地扩展,并在关系图中包含循环。我也在考虑CTE。到目前为止,我发现的CTE递归示例都在同一个表中的记录之间使用父/子层次关系。我还没有遇到过一个演示如何使用第二个关系表的例子,我可能需要使用第二个关系表。