[英]Self join for Hierarchy in a table
我有一个名为hierarchy
的表,其中包含childid
和parentid
列,如下所示:
childid parentid
53047 52915
52915 52914
52914 53037
52914 91856
53037 161212
91856 161212 (great great grandparent of 53047)
我有另一个名为Names
表,它有一个location_id
和一个name
列。 location_id
具有hierarchy
表中childid
和parentid
所有值。
现在我想获取childid
53047 的所有父母、祖父母和曾祖父母的名字。我的输出应该如下所示:
childid childname parentname grandparentname greatgrandparentname
53047 Strasbourg Bas-Rhin Alsace France
我把我的答案放在https://sqleditor.net/q/BkVQc9Etf
-- YOUR ANSWER
;WITH cte AS (
SELECT childid, parentid
, (select name from Names where location_id = childid) AS child_name
, (select name from Names where location_id = parentid) AS parent_name
FROM hierarchy
WHERE childid = 53047
UNION ALL
SELECT hierarchy.childid, hierarchy.parentid
, (select name from Names where location_id = hierarchy.childid) AS child_name
, (select name from Names where location_id = hierarchy.parentid) AS parent_name
FROM hierarchy inner join cte on hierarchy.childid = cte.parentid
)
--pivot
SELECT 53047 AS childid,
(SELECT name from Names where location_id = 53047) AS childname,
[1] AS parentname, [2] AS grandparentname, [3] AS greatgrandparentname, [4] AS greatgreatgrandparentname, [5] AS greatgreatgreatgrandparentname
FROM
(
-- prepare the data set
SELECT
RANK() OVER
(ORDER BY parentid) AS Rank, parent_name
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS id, childid, parentid, child_name, parent_name
FROM cte
) Z
) Y
PIVOT
(
MAX(parent_name)
FOR Rank IN ([1], [2],[3], [4],[5])
) AS pvt;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.