Sql server 具有多列的递归SQL查询

Sql server 具有多列的递归SQL查询,sql-server,tsql,Sql Server,Tsql,我有一个包含以下列的表 idRelationshipType int, idPerson1 int, idPerson2 int 此表允许我指出数据库中应链接在一起的记录 我需要执行一个查询,返回idPerson1或idPerson2列中存在个人id的所有唯一id。此外,我需要递归查询,以便在idPerson1中找到匹配项时,idPerson2的值将包含在结果集中,并用于递归地重复查询,直到找不到更多匹配项为止 示例数据: CREATE TABLE [dbo].[tbRelations

我有一个包含以下列的表

idRelationshipType int,  
idPerson1 int,  
idPerson2 int
此表允许我指出数据库中应链接在一起的记录

我需要执行一个查询,返回idPerson1或idPerson2列中存在个人id的所有唯一id。此外,我需要递归查询,以便在idPerson1中找到匹配项时,idPerson2的值将包含在结果集中,并用于递归地重复查询,直到找不到更多匹配项为止

示例数据:

CREATE TABLE [dbo].[tbRelationships]
(
    [idRelationshipType] [int],
    [idPerson1] [int] ,
    [idPerson2] [int]
)

INSERT INTO tbRelationships (idRelationshipType, idPerson1, idPerson2) 
VALUES (1, 1, 2)  
INSERT INTO tbRelationships (idRelationshipType, idPerson1, idPerson2) 
VALUES (1, 2, 3)  
INSERT INTO tbRelationships (idRelationshipType, idPerson1, idPerson2) 
VALUES (1, 3, 4)  
INSERT INTO tbRelationships (idRelationshipType, idPerson1, idPerson2) 
VALUES (1, 5, 1)
这里定义了四种“关系”。对于这个查询,我只知道一个ID。我需要一个在概念上像

SELECT idPerson 
FROM [some query] 
WHERE [the id i have to start with] = @idPerson 
  AND idRelationshipType = @idRelationshipType
返回的结果应为5行,其中一列为“idPerson”,行值为1、2、3、4和5

我已经尝试了各种UNPIVOT和递归cte的组合,但没有取得多大进展

任何帮助都将不胜感激

谢谢,
丹尼尔我想这就是你想要的:

DECLARE @RelationshipType int
DECLARE @PersonId int

SELECT @RelationshipType = 1, @PersonId = 1

;WITH Hierachy (idPerson1, IdPerson2)
AS
(
    --root 
    SELECT  R.idPerson1, R.idPerson2
    FROM    tbRelationships R
    WHERE   R.idRelationshipType = @RelationshipType
    AND     (R.idPerson1 = @PersonId OR R.idPerson2 = @PersonId)
    --recurse
    UNION ALL
    SELECT  R.idPerson1, R.idPerson2
    FROM    Hierachy H
    JOIN    tbRelationships R
            ON  (R.idPerson1 = H.idPerson2
                 OR R.idPerson2 = H.idPerson1)
            AND R.idRelationshipType = @RelationshipType
)
SELECT DISTINCT idPerson
FROM
(
    SELECT idPerson1 AS idPerson FROM Hierachy
    UNION
    SELECT idPerson2 AS idPerson FROM Hierachy
) H

基本上,获取所需id位于任一列中的第一行,然后根据id列2递归获取所有子id,该列很接近,但如果使用@personId=3,则不会返回1,2,3,4。相反,它只返回2,3,4。如果你使用@personid=4,那么只返回3,4。我不明白为什么你会期望上面描述的结果!您打算从id1向上递归还是从id2向下递归?否则,id=3的1将从何处到达?该表显示了个体之间的关系。它不是分层的-没有父子关系。。。在这种情况下,我需要获取列表上下连接的所有关系。当我有了一个人的身份证,我需要知道所有存在的关系,无论距离有多远。我不认为你期望的答案是正确的-如果你想要所有的关系,那么这意味着对于1-5中的所有ID,你将得到所有返回的ID-根据定义,如果1与1到5相关,那么所有这些都与1相关,并通过扩展彼此相关