以下のようなテーブルを想像してください。
表:人
フィールド: ID、FullName、ParentID
ParentID は Person テーブルの ID を再度参照します。
質問: 上記の例の場合、TSQL でクエリを実行して ID = 7 の Person の最上位の親を見つけるにはどうすればよいですか?
以下のようなテーブルを想像してください。
表:人
フィールド: ID、FullName、ParentID
ParentID は Person テーブルの ID を再度参照します。
質問: 上記の例の場合、TSQL でクエリを実行して ID = 7 の Person の最上位の親を見つけるにはどうすればよいですか?
次のように、共通のテーブル式を使用して、最上位の親が見つかるまで再帰クエリを実行します。
DECLARE @id INT
SET @id = 5
CREATE TABLE #tmp (id INT , ParentId INT)
INSERT INTO #tmp VALUES(1,0)
INSERT INTO #tmp VALUES(2,1)
INSERT INTO #tmp VALUES(3,2);
INSERT INTO #tmp VALUES(4, 3);
INSERT INTO #tmp VALUES(5,4);
WITH parent AS
(
SELECT id, parentId from #tmp WHERE id = @id
UNION ALL
SELECT t.id, t.parentId FROM parent
INNER JOIN #tmp t ON t.id = parent.parentid
)
SELECT TOP 1 id FROM parent
order by id asc
DROP TABLE #tmp
そのクエリをテストしたい場合は、問題ありません。
WITH abcd
AS (
-- anchor
SELECT id, FullName, ParentID,
FullName AS "Path"
FROM Person
WHERE ParentId IS NULL
UNION ALL
--recursive member
SELECT p.id, p.FullName, p.ParentID,
CAST((a.path + '/' + p.FullName) AS VARCHAR(1000)) AS "Path"
FROM Person AS p
JOIN abcd AS a
ON p.ParentId = a.id
)
SELECT * FROM abcd