繁体   English   中英

按层次结构中的级别拆分数据

[英]Split data by levels in hierarchy

初始数据示例:

| ID   |  ParentID  |
|------|------------|
|  1   |    NULL    |
|  2   |     1      |
|  3   |     1      |
|  4   |     2      |
|  5   |    NULL    |
|  6   |     2      |
|  7   |     3      |

在我的初始数据中,我有元素ID和他的父ID。 有些元素有父,有些没有,有些有父母,父母有父母。

此层次结构中的最大级别数为3。

我需要按级别获得此层次结构。

Lvl 1 - 没有父母的元素Lvl 2 - 父母没有父Lvl 3元素 - 父母也有父母的元素。

预期结果如下:

| Lvl1  |   Lvl2   |   Lvl3   |
|-------|----------|----------|
|  1    |   NULL   |   NULL   |
|  1    |    2     |   NULL   |
|  1    |    3     |   NULL   |
|  1    |    2     |    4     |
|  5    |   NULL   |   NULL   |
|  1    |    2     |    6     |
|  1    |    3     |    7     |

我怎么能这样做?

对于固定的三个部门,您可以使用CROSS APPLY

它可以像JOIN一样使用,但也返回额外的记录以给你NULL

SELECT
  Lvl1.ID   AS lvl1,
  Lvl2.ID   AS lvl2,
  Lvl3.ID   AS lvl3
FROM
  initial_data   AS Lvl1
CROSS APPLY
(
   SELECT ID FROM initial_data WHERE ParentID = Lvl1.ID
   UNION ALL
   SELECT NULL AS ID
)
  AS Lvl2
CROSS APPLY
(
   SELECT ID FROM initial_data WHERE ParentID = Lvl2.ID
   UNION ALL
   SELECT NULL AS ID
)
  AS Lvl3
WHERE
  Lvl1.ParentID IS NULL
ORDER BY
  Lvl1.ID,
  Lvl2.ID,
  Lvl3.ID

但是,根据我的评论,这通常表明你正走向非sql路线。 开始时可能会感觉更容易,但后来它会转而咬你,因为SQL会从规范化结构(您的起始数据)中获益匪浅。

暂无
暂无

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

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