SQL Поиск всех связанных записей - PullRequest
0 голосов
/ 02 декабря 2011

Имея таблицу пользователей, любой пользователь может создать дружбу с другим пользователем. Таким образом,

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


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

Часть 1: я ищу способ получить полный набор друзей, друзей друзей и т. Д. Например, User1 вернул бы: User1, User5, User2, User9

Часть 2: Было бы полезно, но не обязательно, если бы я мог получить размер самой большой сети людей

С другой стороны, есть ли лучший способ сохранить связь между пользователями, которая облегчила бы получение необходимой мне информации? Как, например, создание и объединение списка групп дружбы по мере создания дружбы?

Я нашел несколько подобных постов здесь, но ни один из них, похоже, не следует за сетью после первого уровня глубины.

Я думаю, что есть решения, но я даже не знаю, что искать.

1 Ответ

0 голосов
/ 07 декабря 2011

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
...