繁体   English   中英

表中层次结构的自联接

[英]Self join for Hierarchy in a table

我有一个名为hierarchy的表,其中包含childidparentid列,如下所示:

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表中childidparentid所有值。

现在我想获取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;

https://sqleditor.net/q/BkVQc9Etf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM