[英]Split data by levels in hierarchy
Example of initial data: 初始数据示例:
| ID | ParentID |
|------|------------|
| 1 | NULL |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | NULL |
| 6 | 2 |
| 7 | 3 |
In my initial data I have ID of element and his parent ID. 在我的初始数据中,我有元素ID和他的父ID。 Some elements has parent, some has not, some has a parent and his parent has a parent. 有些元素有父,有些没有,有些有父母,父母有父母。
The maximum number of levels in this hierarchy is 3. 此层次结构中的最大级别数为3。
I need to get this hierarchy by levels. 我需要按级别获得此层次结构。
Lvl 1
- elements without parents Lvl 2
- elements with parent which doesn't have parent Lvl 3
- elements with parent which has a parent too. Lvl 1
- 没有父母的元素Lvl 2
- 父母没有父Lvl 3
元素 - 父母也有父母的元素。
Expected result looks like: 预期结果如下:
| Lvl1 | Lvl2 | Lvl3 |
|-------|----------|----------|
| 1 | NULL | NULL |
| 1 | 2 | NULL |
| 1 | 3 | NULL |
| 1 | 2 | 4 |
| 5 | NULL | NULL |
| 1 | 2 | 6 |
| 1 | 3 | 7 |
How I can do it? 我怎么能这样做?
For a fixed dept of three, you can use CROSS APPLY
. 对于固定的三个部门,您可以使用CROSS APPLY
。
It can be used like a JOIN
, but also return extra records to give you the NULL
s. 它可以像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
But, as per my comment, this is often a sign that you're headed down a non-sql route. 但是,根据我的评论,这通常表明你正走向非sql路线。 It might feel easier to start with, but later it turns and bites you, because SQL benefits tremendously from normalised structures (your starting data). 开始时可能会感觉更容易,但后来它会转而咬你,因为SQL会从规范化结构(您的起始数据)中获益匪浅。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.