2016-12-14 169 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

該表指示個人之間的關係。這不是分層的 - 沒有父母的子女關係......在這種情況下,我需要獲得所有關係,無論是在列表中向上或向下連接。當我有一個人的身份證,我需要知道所有存在的關係,無論多遠。 –