本文介紹了T-SQL層次查詢的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個包含分層數據的表:
這是一個包含id、父代id、名稱、代碼(有時不填充)、Level和isroot列的數據示例。在實際場景中,將有更多的級別,而不僅僅是2個級別,但現在讓我們來看一下簡化的示例。
我需要做的是遍歷所有記錄,并在層次結構的任何級別找到id未填充的行:
ID范圍為6到10的行應返回,因為它們在層次結構的任何點都沒有填充代碼
不應返回從%1到%5的行,因為層次結構中的某個位置提到了代碼。
如何使用T-SQL解決此問題?
我想到的唯一解決方案是遞歸(CTE或While),但我發現我嘗試實現的解決方案太復雜,無法解決問題。
推薦答案
與@DhruvJoshi的答案略有不同,因為它可能有用:
WITH recCTE AS
(
SELECT
id,
parent_id,
CASE WHEN CODE IS NOT NULL THEN 1 ELSE 0 END as code_check,
1 as depth,
CAST(id as VARCHAR(50)) as path
FROM table
WHERE isRootLevel = 1
UNION ALL
SELECT
table.id,
table.parent_id,
CASE WHEN CODE IS NOT NULL OR reccte.code_check = 1 THEN 1 ELSE 0 END,
depth + 1 as depth,
reccte.path + CAST(table.id AS varchar(10)) as path
FROM
recCTE
INNER JOIN table ON
recCTE.ID = table.parent_id
WHERE depth < 20 /*just in case you start cycling/endless looping*/
)
SELECT * FROM recCTE where code_check = 0 ORDER BY path, depth;
這篇關于T-SQL層次查詢的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,