![](/img/trans.png)
[英]In self-referencing table with hierarchical data, should I split the table if groups of fields are blank at different hierarchy levels?
[英]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.