2016-12-14 168 views
1

我有以下的列递归SQL查询

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的各种组合,但我没有取得太大进展。

任何帮助将不胜感激。

感谢, 丹尼尔

回答

1

我想这是你想要什么:

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基于id列2

+0

这很接近,但是,如果您使用@ personId = 3,则它不会返回1,2,3,4。相反,它只返回2,3,4。如果您使用@ personid = 4,则只返回3,4。 –

+0

我不明白为什么你会期望你上面描述的结果!你是否打算从id1以及从id2下调?否则,1将从id = 3到达哪里? –

+0

该表指示个人之间的关系。这不是分层的 - 没有父母的子女关系......在这种情况下,我需要获得所有关系,无论是在列表中向上或向下连接。当我有一个人的身份证,我需要知道所有存在的关系,无论多远。 –