Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取父子层次结构中的所有父对象_Sql_Sql Server_Sql Server 2008_Common Table Expression - Fatal编程技术网

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

你能举一个预期结果与源数据不同的例子吗?