Sql 获取父子层次结构中的所有父对象
我的表格中有以下数据Sql 获取父子层次结构中的所有父对象,sql,sql-server,sql-server-2008,common-table-expression,Sql,Sql Server,Sql Server 2008,Common Table Expression,我的表格中有以下数据 ID NAME PARENTID STATUS ----------- ------------------------------ ----------- ------ 1 Folder A 0 0 2 Folder B 1 0 3
ID NAME PARENTID STATUS
----------- ------------------------------ ----------- ------
1 Folder A 0 0
2 Folder B 1 0
3 Folder C 2 1
4 Folder D 1 0
5 Folder E 4 0
6 Folder G 5 0
7 Folder H 6 1
SELECT *
FROM @Temp WHERE [STATUS]=1
ID NAME PARENTID STATUS
----------- ------------------------------ ----------- ------
1 Folder A 0 0
2 Folder B 1 0
3 Folder C 2 1
4 Folder D 1 0
5 Folder E 4 0
6 Folder G 5 0
7 Folder H 6 1
以上记录来自表[@Temp]
[Name] - Folder Name
[ID] - Unique ID of folder in database (identity)
[ParentID] - Represents the parent of current folder.
SELECT *
FROM @Temp WHERE [STATUS]=1
用于在表中填充上述数据的查询:
DECLARE @Temp TABLE
(
[ID] INT IDENTITY(1, 1) ,
[NAME] VARCHAR(30) ,
[PARENTID] INT,
[STATUS] BIT
)
INSERT INTO @Temp
SELECT 'Folder A' ,
0, 0
UNION
SELECT 'Folder B' ,
1, 0
UNION
SELECT 'Folder C' ,
2, 1
UNION
SELECT 'Folder D' ,
1, 0
UNION
SELECT 'Folder E' ,
4, 0
UNION
SELECT 'Folder G' ,
5, 0
UNION
SELECT 'Folder H' ,
6, 1
SELECT *
FROM @Temp WHERE [STATUS]=1
我使用以下查询来获取status=1的记录
SELECT *
FROM @Temp WHERE [STATUS]=1
这将提供以下输出
SELECT *
FROM @Temp WHERE [STATUS]=1
ID NAME PARENTID STATUS
----------- ------------------------------ ----------- ------
3 Folder C 2 1
7 Folder H 6 1
我的目标是也获取那些记录,这些记录是父记录(直到parentid=0)上述查询附带的记录。i、 e我要获取此输出,其中包含文件夹C和文件夹H的父级:
SELECT *
FROM @Temp WHERE [STATUS]=1
我做了一个递归CTE-我从底部开始,任何没有子文件夹的文件夹。从那里,我向上传递“GOOD”列中是否遇到了“1”状态,而distinct清除了从底部开始创建的重复项
SELECT *
FROM @Temp WHERE [STATUS]=1
;WITH CTE AS
(
SELECT ID, NAME, PARENTID, STATUS GOOD, STATUS
FROM @Temp T1
WHERE NOT EXISTS (SELECT * FROM @Temp T2 WHERE T2.PARENTID = T1.ID)
UNION ALL
SELECT T.ID, T.NAME, T.PARENTID, T.STATUS | C.GOOD GOOD, T.STATUS
FROM @Temp T
JOIN CTE C
ON C.PARENTID = T.ID
)
SELECT DISTINCT ID, NAME, PARENTID, STATUS FROM CTE
WHERE GOOD = 1
ORDER BY ID ASC
你能举一个预期结果与源数据不同的例子吗?