簡體   English   中英

獲取頂級父母 ID 繼承給 SQL 中的所有孩子

[英]Get top level parents ID inherit to all children in SQL

我有一張這樣的桌子

ID    Name     Parent    Code
----------------------------------
1     Item1     NULL     K123
2     Item2     NULL     K324
3     Item3      1       NULL
4     Item4      2       NULL
5     Item5      3       NULL
6     Item6      5       NULL
7     Item7      4       NULL
8     Item8      NULL    K567
9     Item9      8       NULL
10    Item10     NULL    NULL
---------------------------------

我需要像這樣從其父級繼承代碼給所有子級

ID    Name     Parent    Code
----------------------------------
1     Item1     NULL     K123
2     Item2     NULL     K324
3     Item3      1       K123
4     Item4      2       K324
5     Item5      3       K123
6     Item6      5       K123
7     Item7      4       K324
8     Item8      NULL    K567
9     Item9      8       K567
10    Item10     NULL    NULL
---------------------------------

我嘗試了下面的 CTE

;with CTE(ID,Name,Parent,Code,[Level]) as
(
    select ID,Name,Parent,Code,0 as [Level] from tbl_mytable 
    union all
    select T.ID,T.Name,T.Parent,T.Code,C.[Level]+1 from tbl_mytable T
    inner join CTE C on C.Parent=T.ID
)
select * from CTE C

這無助於我實現我正在嘗試的目標。 我只是 CTE 的初學者,我認為它無法解決。

您在正確的軌道上使用遞歸 CTE,但您的邏輯有點偏離。 考慮這個工作版本:

WITH cte AS (
    SELECT * FROM tbl_mytable WHERE Parent IS NULL
    UNION ALL
    SELECT t1.ID, t1.Name, t1.Parent, COALESCE(t1.Code, t2.Code)
    FROM tbl_mytable t1
    INNER JOIN cte t2
        ON t1.Parent = t2.ID
)

SELECT *
FROM cte
ORDER BY ID;

在此處輸入圖像描述

演示

遞歸 CTE 的基本案例組件(即聯合之前的內容)應該是那些沒有父項的記錄。 這就是我們知道他們是最高父級的方式。 然后,我們通過將給定級別與緊接其上方的父級匹配來遞歸地加入 CTE。 然后,我們使用一個技巧從頂層降低代碼:

COALESCE(t1.Code, t2.Code)

這將從父代碼之一開始,然后向下傳播到各個級別的子代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM