0

2 つのテーブルがあり、最初のテーブルには個人データが含まれています

ID
Name

2つ目は各人親族

Primary Key Field
Person (references person.id)
RelativeType (mother or father)
Parent (references person.id)

特定の人物のすべての息子と孫を取得しようとしていますが、孫をクエリ結果に統合するのに苦労しています。SQL Server を使用しています。

何か案は?

4

4 に答える 4

1

必要なクエリは、親子関係のレベル数に大きく依存します。スキーマを変更できる場合HierarchyIdは、SQL Server 固有のデータ型を使用することをお勧めします。こちらをご覧ください。

以下では、2 つのレベルしかないと仮定します。父 - 息子 - 孫

;WITH Sons AS (
    SELECT pdf.Id, pdf.Name, pdd.Id ParentId, pdd.Name Parent FROM PersonData pdf
    JOIN PersonRelative pr ON pdf.Id = pr.Parent
    JOIN PersonData pdd ON pr.Person = pdd.Id //Selecting all Parents
)

SELECT pd.Name, s.Name Son, 'Son' Type FROM PersonData pd
JOIN Sons s on pd.Id = s.ParentId

UNION

SELECT pd.Name, gs.Name Son, 'GrandSon' Type FROM PersonData pd
JOIN Sons s on pd.Id = s.ParentId
JOIN Sons gs on s.Id = gs.ParentId
于 2013-09-04T12:49:22.583 に答える
0

前述のように、再帰 CTEはこれを達成する方法です。

DECLARE @PersonToFind INT
SET @PersonToFind = 1

;WITH RCTE AS 
(
    SELECT Person, CAST('Child' AS NVARCHAR(MAX)) AS Relation 
    FROM PersonRelations 
    WHERE Father = @PersonToFind OR Mother = @PersonToFind 

    UNION ALL

    SELECT pr.Person, 'Grand' + r.Relation
    FROM PersonRelations pr 
        INNER JOIN RCTE r ON r.Person = pr.Mother OR r.Person = pr.Father
)
SELECT r.*, p.Name 
FROM RCTE r
    LEFT JOIN Person p ON r.Person = p.ID

SQLFiddle デモ

(これは、質問が編集される前に母と父の列を使用しているため、チェックParentがある場所に変更するだけです)Mother OR Father

于 2013-09-04T12:45:40.577 に答える