【发布时间】:2020-05-29 00:48:00
【问题描述】:
我有一个脚本来查找类别列表的层次结构。但是,我需要知道关卡的深度才能找到所有相应的类别。所以我的问题是有没有更好的方法来重写代码,以便它可以深入到最低级别,而无需我指定深度。如下面的示例,我必须知道类别级别达到 5 级深度才能找到所有类别。
WITH rCTE AS
(
SELECT
*,
0 AS Level
FROM dbo.inv_category ic
WHERE ic.Primary_org_id = 56392
UNION ALL
SELECT
t.*,
r.Level + 1 AS Level
FROM dbo.inv_category t
INNER JOIN rCTE r ON t.Parent_id = r.Category_id
)
SELECT DISTINCT
c1.Parent_id, c1.Category_id, c1.Category,
c2.Category, c2.Category_id, c2.Parent_id,
c3.Category, c3.Category_id, c3.Parent_id,
c4.Category, c4.Category_id, c4.Parent_id,
c5.Category, c5.Category_id, c5.Parent_id
FROM
rCTE c1
LEFT OUTER JOIN
rCTE c2 ON c1.Category_id = c2.Parent_id
LEFT OUTER JOIN
rCTE c3 ON c2.Category_id = c3.Parent_id
LEFT OUTER JOIN
rCTE c4 ON c3.Category_id = c4.Parent_id
LEFT OUTER JOIN
rCTE c5 ON c4.Category_id = c5.Parent_id
WHERE
c1.Parent_id = 0
ORDER BY
c1.Category, c2.Category
【问题讨论】:
-
如果您想要动态的列数,那么您需要使用“动态 SQL”,首先计算列数(级别),然后动态地组装一条包含所有必要列的 SQL 语句。或者,您可以将所有级别“连接”到一个 VARCHAR 列中,但这可能不是您想要的。
标签: sql sql-server tsql join recursive-query