本文介紹了T-SQL層次查詢的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我有一個(gè)包含分層數(shù)據(jù)的表:
這是一個(gè)包含id、父代id、名稱、代碼(有時(shí)不填充)、Level和isroot列的數(shù)據(jù)示例。在實(shí)際場景中,將有更多的級別,而不僅僅是2個(gè)級別,但現(xiàn)在讓我們來看一下簡化的示例。
我需要做的是遍歷所有記錄,并在層次結(jié)構(gòu)的任何級別找到id未填充的行:
ID范圍為6到10的行應(yīng)返回,因?yàn)樗鼈冊趯哟谓Y(jié)構(gòu)的任何點(diǎn)都沒有填充代碼
不應(yīng)返回從%1到%5的行,因?yàn)閷哟谓Y(jié)構(gòu)中的某個(gè)位置提到了代碼。
如何使用T-SQL解決此問題?
我想到的唯一解決方案是遞歸(CTE或While),但我發(fā)現(xiàn)我嘗試實(shí)現(xiàn)的解決方案太復(fù)雜,無法解決問題。
推薦答案
與@DhruvJoshi的答案略有不同,因?yàn)樗赡苡杏茫?/p>
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;
這篇關(guān)于T-SQL層次查詢的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,