Arc*_*l33 21 sql-server hierarchy order-by sql-server-2008-r2
我必须跟踪 SQL Server 2008 R2 中的数据。SQLFiddle
架构:
创建表 [dbo].[ICFilters]( [ICFilterID] [int] IDENTITY(1,1) 非空, [ParentID] [int] NOT NULL DEFAULT 0, [FilterDesc] [varchar](50) NOT NULL, [Active] [tinyint] NOT NULL DEFAULT 1, 约束 [PK_ICFilters] 主键聚集 ( [ICFilterID] ASC ) 与 PAD_INDEX = 关闭, STATISTICS_NORECOMPUTE = 关闭, IGNORE_DUP_KEY = 关闭, ALLOW_ROW_LOCKS = 开, ALLOW_PAGE_LOCKS = 开 ) 在 [主要] ) 在 [主要] INSERT INTO [dbo].[ICFilters] (ParentID,FilterDesc,Active) 价值观 (0,'产品类型',1), (1,'ProdSubType_1',1), (1,'ProdSubType_2',1), (1,'ProdSubType_3',1), (1,'ProdSubType_4',1), (2,'PST_1.1',1), (2,'PST_1.2',1), (2,'PST_1.3',1), (2,'PST_1.4',1), (2,'PST_1.5',1), (2,'PST_1.6',1), (2,'PST_1.7',0), (3,'PST_2.1',1), (3,'PST_2.2',0), (3,'PST_2.3',1), (3,'PST_2.4',1), (14,'PST_2.2.1',1), (14,'PST_2.2.2',1), (14,'PST_2.2.3',1), (3,'PST_2.8',1)
桌子:
| ICFILTERID | 家长 | 过滤器 | 活跃 | -------------------------------------------------- | 1 | 0 | 产品类型 | 1 | | 2 | 1 | ProdSubType_1 | 1 | | 3 | 1 | ProdSubType_2 | 1 | | 4 | 1 | ProdSubType_3 | 1 | | 5 | 1 | ProdSubType_4 | 1 | | 6 | 2 | PST_1.1 | 1 | | 7 | 2 | PST_1.2 | 1 | | 8 | 2 | PST_1.3 | 1 | | 9 | 2 | PST_1.4 | 1 | | 10 | 2 | PST_1.5 | 1 | | 11 | 2 | PST_1.6 | 1 | | 12 | 2 | PST_1.7 | 0 | | 13 | 3 | PST_2.1 | 1 | | 14 | 3 | PST_2.2 | 0 | | 15 | 3 | PST_2.3 | 1 | | 16 | 3 | PST_2.4 | 1 | | 17 | 14 | PST_2.2.1 | 1 | | 18 | 14 | PST_2.2.2 | 1 | | 19 | 14 | PST_2.2.3 | 1 | | 20 | 3 | PST_2.8 | 1 |
每一行都有其父的 ID 和根的parentid = 0
. 该FilterDesc
s为刚刚样本的描述,所以我不能尝试解析那些排序。
是否可以以树状方式选择所有行?如果是这样,如何?当我说“树状”时,我的意思是递归选择父级,然后是所有子级,然后是每个子级的所有子级,依此类推。深度优先树遍历。
我和我的朋友们已经尝试过,但我们没有找到可行的解决方案,但会继续尝试。我对sql相当陌生,所以也许这可以轻松完成,而且我只是让事情变得比必要的更难。
示例(所需)输出:
| ICFILTERID | 家长 | 过滤器 | 活跃 | -------------------------------------------------- | 1 | 0 | 产品类型 | 1 | | 2 | 1 | ProdSubType_1 | 1 | | 6 | 2 | PST_1.1 | 1 | | 7 | 2 | PST_1.2 | 1 | | 8 | 2 | PST_1.3 | 1 | | 9 | 2 | PST_1.4 | 1 | | 10 | 2 | PST_1.5 | 1 | | 11 | 2 | PST_1.6 | 1 | | 12 | 2 | PST_1.7 | 0 | | 3 | 1 | ProdSubType_2 | 1 | | 13 | 3 | PST_2.1 | 1 | | 14 | 3 | PST_2.2 | 0 | | 17 | 14 | PST_2.2.1 | 1 | | 18 | 14 | PST_2.2.2 | 1 | | 19 | 14 | PST_2.2.3 | 1 | | 15 | 3 | PST_2.3 | 1 | | 16 | 3 | PST_2.4 | 1 | | 20 | 3 | PST_2.8 | 1 | | 4 | 1 | ProdSubType_3 | 1 | | 5 | 1 | ProdSubType_4 | 1 |
Tra*_*vis 25
好的,足够的脑细胞已经死亡。
WITH cte AS
(
SELECT
[ICFilterID],
[ParentID],
[FilterDesc],
[Active],
CAST(0 AS varbinary(max)) AS Level
FROM [dbo].[ICFilters]
WHERE [ParentID] = 0
UNION ALL
SELECT
i.[ICFilterID],
i.[ParentID],
i.[FilterDesc],
i.[Active],
Level + CAST(i.[ICFilterID] AS varbinary(max)) AS Level
FROM [dbo].[ICFilters] i
INNER JOIN cte c
ON c.[ICFilterID] = i.[ParentID]
)
SELECT
[ICFilterID],
[ParentID],
[FilterDesc],
[Active]
FROM cte
ORDER BY [Level];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
78596 次 |
最近记录: |