すべての親候補を1つのフィールドにまとめるには?
この章の最後のタスクでは、ある1つのIDからたどれるすべての親を見つけ、見つかった各世代のIDを1つのフィールドに結合します。
そのために、再帰的にすべての該当メンバーを探索し、その情報を1つのフィールドに追加していきます。ID を文字列として結合するために CAST() 演算子を使う必要があります。
ID = 290 を起点に、すべての家族メンバーを検索します。テーブル family には合計で300件のレコードがあります。
この演習はコースの一部です
SQL Server における階層型クエリと再帰クエリ
演習の手順
- 起点として 290 の
ParentIDを設定します。 CASEの処理でParent.ID = ''の場合、Parentフィールドは現在のParentIDに設定します。CASEの処理でParent.ID <> ''の場合、各反復で現在のParentに親IDを追加します。- 定義した CTE から
NameとParentを選択します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
WITH tree AS (
SELECT
ID,
Name,
ParentID,
CAST('0' AS VARCHAR(MAX)) as Parent
FROM family
-- Initialize the ParentID to 290
WHERE ___ = ___
UNION ALL
SELECT
Next.ID,
Next.Name,
Parent.ID,
CAST(CASE WHEN Parent.ID = ''
-- Set the Parent field to the current ParentID
THEN(CAST(Next.___ AS VARCHAR(MAX)))
-- Add the ParentID to the current Parent in each iteration
ELSE(Parent.Parent + ' -> ' + CAST(Next.___ AS VARCHAR(MAX)))
END AS VARCHAR(MAX))
FROM family AS Next
INNER JOIN tree AS Parent
ON Next.ParentID = Parent.ID)
-- Select the Name, Parent from tree
SELECT ___, ___
FROM ___;