2 つのテーブルがあり、最初のテーブルには個人データが含まれています
ID
Name
2つ目は各人親族
Primary Key Field
Person (references person.id)
RelativeType (mother or father)
Parent (references person.id)
特定の人物のすべての息子と孫を取得しようとしていますが、孫をクエリ結果に統合するのに苦労しています。SQL Server を使用しています。
何か案は?
2 つのテーブルがあり、最初のテーブルには個人データが含まれています
ID
Name
2つ目は各人親族
Primary Key Field
Person (references person.id)
RelativeType (mother or father)
Parent (references person.id)
特定の人物のすべての息子と孫を取得しようとしていますが、孫をクエリ結果に統合するのに苦労しています。SQL Server を使用しています。
何か案は?
必要なクエリは、親子関係のレベル数に大きく依存します。スキーマを変更できる場合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
前述のように、再帰 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
(これは、質問が編集される前に母と父の列を使用しているため、チェックParent
がある場所に変更するだけです)Mother OR Father