非常酷的問題。雖然它是一個社交網絡圖,但它仍然是一個分層問題,即使層次結構可以在邏輯上轉變成一個互連網絡。在MSSQL中,您仍然希望使用WITH
子句執行遞歸查詢,唯一的區別是由於需要使用多個互連來確保唯一結果,請使用DISTINCT
或WHERE
條件中的IN
子句。
這工作:
DECLARE @PersonID bigint;
SET @PersonID = 1;
WITH RecurseRelations (PersonID, OriginalPersonID)
AS
(
SELECT PersonID, PersonId OriginalPersonID
FROM People
UNION ALL
SELECT ToPersonID, RR.OriginalPersonID
FROM Relationships R
INNER JOIN
RecurseRelations RR
ON
R.FromPersonID = RR.PersonID
)
SELECT PersonId, Name
FROM People
WHERE PersonId IN
(
SELECT PersonID
FROM RecurseRelations
WHERE OriginalPersonID = @PersonID
)
這裏有更多的關係比你原本和整個家庭其他一些測試數據,以確保它不會拿起超過預期。
create table People (PersonId bigint, Name nvarchar(200));
create table Relationships (FromPersonID bigint, ToPersonID bigint, Title nvarchar(200));
insert into People values (1, 'John Smith');
insert into People values (2, 'Joan Smith');
insert into People values (3, 'Jack Smith');
insert into People values (4, 'Joey Smith');
insert into People values (9, 'Jaime Smith');
insert into People values (5, 'Edward Jones');
insert into People values (6, 'Emma Jones');
insert into People values (7, 'Eva Jones');
insert into People values (8, 'Eve Jones');
insert into Relationships values (1, 2, 'Spouse');
insert into Relationships values (1, 3, 'Parent');
insert into Relationships values (2, 3, 'Parent');
insert into Relationships values (3, 4, 'Child');
insert into Relationships values (2, 4, 'Child');
insert into Relationships values (4, 9, 'Child');
insert into Relationships values (5, 6, 'Spouse');
insert into Relationships values (5, 7, 'Parent');
insert into Relationships values (6, 7, 'Parent');
insert into Relationships values (5, 8, 'Child');
您正在使用哪個數據庫? – beny23
MS SQL Server 2012,謝謝! – Dai
非常有趣的問題。你能詳細說明你確切的問題嗎? 你的問題可以是「從人物和關係中找到兄弟姐妹」。 如果可能,你能告訴我們一個你期望的結果集嗎? – naota