簡體   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