Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/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 server获取递归数据_Sql_Sql Server 2008 - Fatal编程技术网

使用sql server获取递归数据

使用sql server获取递归数据,sql,sql-server-2008,Sql,Sql Server 2008,我正在尝试获取递归数据。 下面的代码返回顶部的所有父级,然后返回子级。 我想获取数据父1–他的孩子然后是父2–他的孩子然后是父3–他的孩子。 我该怎么做 USE Subscriber GO WITH Parent (ParentId, Id, Name,subscriberID) AS ( -- Anchor member definition SELECT A.ParentId,A.id, A.name,A.SubscriberId FROM Subscriber.Budg

我正在尝试获取递归数据。 下面的代码返回顶部的所有父级,然后返回子级。 我想获取数据父1–他的孩子然后是父2–他的孩子然后是父3–他的孩子。 我该怎么做

USE  Subscriber
GO
WITH Parent (ParentId, Id, Name,subscriberID)
AS
(
-- Anchor member definition
    SELECT A.ParentId,A.id, A.name,A.SubscriberId

    FROM Subscriber.Budget.SubscriberCategory AS A   
    WHERE ParentId IS NULL
    UNION ALL
-- Recursive member definition
    SELECT B.ParentId, B.id, B.name,B.SubscriberId

    FROM Subscriber.Budget.SubscriberCategory AS B 

    INNER JOIN Parent AS P


ON B.ParentId = P.Id
)

-- Statement that executes the CTE
SELECT parentId, id, name
FROM Parent
where subscriberID = '1C18093B-5031-42E4-9251-CEF69114365F'

GO
看看游标


我个人不喜欢他们,因为我可以避开他们,但这会让你一次抓住一个家长,然后抓住所有家长的孩子。

这里有一个通用的解决方案,OP可以映射到他们的表/列:

设置数据

DECLARE @Staff table (UserID char(4), UserName varchar(10), ManagerID char(4))
INSERT @Staff VALUES ('ABC1','Jerome', NULL )
INSERT @Staff VALUES ('ABC2','Joe'   ,'ABC1')
INSERT @Staff VALUES ('ABC3','Paul'  ,'ABC2')
INSERT @Staff VALUES ('ABC4','Jack'  ,'ABC3')
INSERT @Staff VALUES ('ABC5','Daniel','ABC3')
INSERT @Staff VALUES ('ABC6','David' ,'ABC2')
INSERT @Staff VALUES ('ABC7','Ian'   ,'ABC6')
INSERT @Staff VALUES ('ABC8','Helen' ,'ABC6')
INSERT @Staff VALUES ('ABC9','Sam'   , NULL)
INSERT @Staff VALUES ('ABD1','Ron'   ,'ABC9')
INSERT @Staff VALUES ('ABD2','Bill'  ,'ABC9')
INSERT @Staff VALUES ('ABD3','Fred'  ,'ABD1')

DECLARE @RootUserID  char(4)
SET @RootUserID='ABC2'
得到完整的树

;WITH StaffTree AS
(
    SELECT 
        UserID, UserName, ManagerID, CONVERT(char(4),NULL) AS ManagerUserID, 1 AS LevelOf
            ,CONVERT(varchar(max),UserID) AS ChainOfCommand
        FROM @Staff
        WHERE ManagerID IS NULL
    UNION ALL
        SELECT 
            s.UserID, s.UserName, s.ManagerID, t.UserID, t.LevelOf+1
                ,ISNULL(t.ChainOfCommand,'')+'|'+s.ManagerID
        FROM StaffTree         t
            INNER JOIN @Staff  s ON t.UserID=s.ManagerID

)
SELECT * FROM StaffTree ORDER BY ChainOfCommand,UserID
获取给定用户的树

;WITH StaffTree AS
(
    SELECT 
        UserID, UserName, ManagerID, CONVERT(char(4),NULL) AS ManagerUserID, 1 AS LevelOf
            ,CONVERT(varchar(max),UserID) AS ChainOfCommand
        FROM @Staff
        WHERE UserID=@RootUserID
    UNION ALL
        SELECT 
            s.UserID, s.UserName, s.ManagerID, t.UserID, t.LevelOf+1
                ,ISNULL(t.ChainOfCommand,'')+'|'+s.ManagerID
        FROM StaffTree         t
            INNER JOIN @Staff  s ON t.UserID=s.ManagerID
        WHERE s.ManagerID=@RootUserID

)
SELECT * FROM StaffTree ORDER BY ChainOfCommand,UserID
输出:

UserID UserName   ManagerID ManagerUserID LevelOf     ChainOfCommand
------ ---------- --------- ------------- ----------- ------------------------
ABC1   Jerome     NULL      NULL          1           ABC1
ABC2   Joe        ABC1      ABC1          2           ABC1|ABC1
ABC3   Paul       ABC2      ABC2          3           ABC1|ABC1|ABC2
ABC6   David      ABC2      ABC2          3           ABC1|ABC1|ABC2
ABC4   Jack       ABC3      ABC3          4           ABC1|ABC1|ABC2|ABC3
ABC5   Daniel     ABC3      ABC3          4           ABC1|ABC1|ABC2|ABC3
ABC7   Ian        ABC6      ABC6          4           ABC1|ABC1|ABC2|ABC6
ABC8   Helen      ABC6      ABC6          4           ABC1|ABC1|ABC2|ABC6
ABC9   Sam        NULL      NULL          1           ABC9
ABD1   Ron        ABC9      ABC9          2           ABC9|ABC9
ABD2   Bill       ABC9      ABC9          2           ABC9|ABC9
ABD3   Fred       ABD1      ABD1          3           ABC9|ABC9|ABD1

(12 row(s) affected)

UserID UserName   ManagerID ManagerUserID LevelOf     ChainOfCommand
------ ---------- --------- ------------- ----------- ------------------------
ABC2   Joe        ABC1      NULL          1           ABC2
ABC3   Paul       ABC2      ABC2          2           ABC2|ABC2
ABC6   David      ABC2      ABC2          2           ABC2|ABC2

(3 row(s) affected)
UserID                               UserName   ManagerID                            ManagerUserID                        LevelOf     ChainOfCommand
------------------------------------ ---------- ------------------------------------ ------------------------------------ ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------
6A3BEB4C-D116-481E-B98D-4779246C4B09 Sam        NULL                                 NULL                                 1           6A3BEB4C-D116-481E-B98D-4779246C4B09
6A3BEB4C-D116-481E-B98D-4779246C4B11 Ron        6A3BEB4C-D116-481E-B98D-4779246C4B09 6A3BEB4C-D116-481E-B98D-4779246C4B09 2           6A3BEB4C-D116-481E-B98D-4779246C4B09|6A3BEB4C-D116-481E-B98D-4779246C4B09
6A3BEB4C-D116-481E-B98D-4779246C4B12 Bill       6A3BEB4C-D116-481E-B98D-4779246C4B09 6A3BEB4C-D116-481E-B98D-4779246C4B09 2           6A3BEB4C-D116-481E-B98D-4779246C4B09|6A3BEB4C-D116-481E-B98D-4779246C4B09
6A3BEB4C-D116-481E-B98D-4779246C4B13 Fred       6A3BEB4C-D116-481E-B98D-4779246C4B11 6A3BEB4C-D116-481E-B98D-4779246C4B11 3           6A3BEB4C-D116-481E-B98D-4779246C4B09|6A3BEB4C-D116-481E-B98D-4779246C4B09|6A3BEB4C-D116-481E-B98D-4779246C4B11
6A3BEB4C-D116-481E-B98D-4779246C4B0D Jerome     NULL                                 NULL                                 1           6A3BEB4C-D116-481E-B98D-4779246C4B0D
6A3BEB4C-D116-481E-B98D-4779246C4B02 Joe        6A3BEB4C-D116-481E-B98D-4779246C4B0D 6A3BEB4C-D116-481E-B98D-4779246C4B0D 2           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D
6A3BEB4C-D116-481E-B98D-4779246C4B03 Paul       6A3BEB4C-D116-481E-B98D-4779246C4B02 6A3BEB4C-D116-481E-B98D-4779246C4B02 3           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02
6A3BEB4C-D116-481E-B98D-4779246C4B06 David      6A3BEB4C-D116-481E-B98D-4779246C4B02 6A3BEB4C-D116-481E-B98D-4779246C4B02 3           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02
6A3BEB4C-D116-481E-B98D-4779246C4B04 Jack       6A3BEB4C-D116-481E-B98D-4779246C4B03 6A3BEB4C-D116-481E-B98D-4779246C4B03 4           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02|6A3BEB4C-D116-481E-B98D-4779246C4B03
6A3BEB4C-D116-481E-B98D-4779246C4B05 Daniel     6A3BEB4C-D116-481E-B98D-4779246C4B03 6A3BEB4C-D116-481E-B98D-4779246C4B03 4           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02|6A3BEB4C-D116-481E-B98D-4779246C4B03
6A3BEB4C-D116-481E-B98D-4779246C4B07 Ian        6A3BEB4C-D116-481E-B98D-4779246C4B06 6A3BEB4C-D116-481E-B98D-4779246C4B06 4           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02|6A3BEB4C-D116-481E-B98D-4779246C4B06
6A3BEB4C-D116-481E-B98D-4779246C4B08 Helen      6A3BEB4C-D116-481E-B98D-4779246C4B06 6A3BEB4C-D116-481E-B98D-4779246C4B06 4           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02|6A3BEB4C-D116-481E-B98D-4779246C4B06

(12 row(s) affected)
编辑对上述代码进行基本编辑,以使用唯一标识符ID:

DECLARE @Staff table (UserID uniqueidentifier, UserName varchar(10), ManagerID uniqueidentifier)
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B0D','Jerome', NULL )
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B02','Joe'   ,'6A3BEB4C-D116-481E-B98D-4779246C4B0D')
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B03','Paul'  ,'6A3BEB4C-D116-481E-B98D-4779246C4B02')
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B04','Jack'  ,'6A3BEB4C-D116-481E-B98D-4779246C4B03')
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B05','Daniel','6A3BEB4C-D116-481E-B98D-4779246C4B03')
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B06','David' ,'6A3BEB4C-D116-481E-B98D-4779246C4B02')
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B07','Ian'   ,'6A3BEB4C-D116-481E-B98D-4779246C4B06')
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B08','Helen' ,'6A3BEB4C-D116-481E-B98D-4779246C4B06')
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B09','Sam'   , NULL)
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B11','Ron'   ,'6A3BEB4C-D116-481E-B98D-4779246C4B09')
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B12','Bill'  ,'6A3BEB4C-D116-481E-B98D-4779246C4B09')
INSERT @Staff VALUES ('6A3BEB4C-D116-481E-B98D-4779246C4B13','Fred'  ,'6A3BEB4C-D116-481E-B98D-4779246C4B11')


DECLARE @RootUserID  char(4)
SET @RootUserID='6A3BEB4C-D116-481E-B98D-4779246C4B02'

;WITH StaffTree AS
(
    SELECT 
        UserID, UserName, ManagerID, CONVERT(uniqueidentifier,NULL) AS ManagerUserID, 1 AS LevelOf
            ,CONVERT(varchar(max),UserID) AS ChainOfCommand
        FROM @Staff
        WHERE ManagerID IS NULL
    UNION ALL
        SELECT 
            s.UserID, s.UserName, s.ManagerID, t.UserID, t.LevelOf+1
                ,ISNULL(t.ChainOfCommand,'')+'|'+CONVERT(varchar(max),s.ManagerID)
        FROM StaffTree         t
            INNER JOIN @Staff  s ON t.UserID=s.ManagerID

)
SELECT * FROM StaffTree ORDER BY ChainOfCommand,UserID
输出:

UserID UserName   ManagerID ManagerUserID LevelOf     ChainOfCommand
------ ---------- --------- ------------- ----------- ------------------------
ABC1   Jerome     NULL      NULL          1           ABC1
ABC2   Joe        ABC1      ABC1          2           ABC1|ABC1
ABC3   Paul       ABC2      ABC2          3           ABC1|ABC1|ABC2
ABC6   David      ABC2      ABC2          3           ABC1|ABC1|ABC2
ABC4   Jack       ABC3      ABC3          4           ABC1|ABC1|ABC2|ABC3
ABC5   Daniel     ABC3      ABC3          4           ABC1|ABC1|ABC2|ABC3
ABC7   Ian        ABC6      ABC6          4           ABC1|ABC1|ABC2|ABC6
ABC8   Helen      ABC6      ABC6          4           ABC1|ABC1|ABC2|ABC6
ABC9   Sam        NULL      NULL          1           ABC9
ABD1   Ron        ABC9      ABC9          2           ABC9|ABC9
ABD2   Bill       ABC9      ABC9          2           ABC9|ABC9
ABD3   Fred       ABD1      ABD1          3           ABC9|ABC9|ABD1

(12 row(s) affected)

UserID UserName   ManagerID ManagerUserID LevelOf     ChainOfCommand
------ ---------- --------- ------------- ----------- ------------------------
ABC2   Joe        ABC1      NULL          1           ABC2
ABC3   Paul       ABC2      ABC2          2           ABC2|ABC2
ABC6   David      ABC2      ABC2          2           ABC2|ABC2

(3 row(s) affected)
UserID                               UserName   ManagerID                            ManagerUserID                        LevelOf     ChainOfCommand
------------------------------------ ---------- ------------------------------------ ------------------------------------ ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------
6A3BEB4C-D116-481E-B98D-4779246C4B09 Sam        NULL                                 NULL                                 1           6A3BEB4C-D116-481E-B98D-4779246C4B09
6A3BEB4C-D116-481E-B98D-4779246C4B11 Ron        6A3BEB4C-D116-481E-B98D-4779246C4B09 6A3BEB4C-D116-481E-B98D-4779246C4B09 2           6A3BEB4C-D116-481E-B98D-4779246C4B09|6A3BEB4C-D116-481E-B98D-4779246C4B09
6A3BEB4C-D116-481E-B98D-4779246C4B12 Bill       6A3BEB4C-D116-481E-B98D-4779246C4B09 6A3BEB4C-D116-481E-B98D-4779246C4B09 2           6A3BEB4C-D116-481E-B98D-4779246C4B09|6A3BEB4C-D116-481E-B98D-4779246C4B09
6A3BEB4C-D116-481E-B98D-4779246C4B13 Fred       6A3BEB4C-D116-481E-B98D-4779246C4B11 6A3BEB4C-D116-481E-B98D-4779246C4B11 3           6A3BEB4C-D116-481E-B98D-4779246C4B09|6A3BEB4C-D116-481E-B98D-4779246C4B09|6A3BEB4C-D116-481E-B98D-4779246C4B11
6A3BEB4C-D116-481E-B98D-4779246C4B0D Jerome     NULL                                 NULL                                 1           6A3BEB4C-D116-481E-B98D-4779246C4B0D
6A3BEB4C-D116-481E-B98D-4779246C4B02 Joe        6A3BEB4C-D116-481E-B98D-4779246C4B0D 6A3BEB4C-D116-481E-B98D-4779246C4B0D 2           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D
6A3BEB4C-D116-481E-B98D-4779246C4B03 Paul       6A3BEB4C-D116-481E-B98D-4779246C4B02 6A3BEB4C-D116-481E-B98D-4779246C4B02 3           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02
6A3BEB4C-D116-481E-B98D-4779246C4B06 David      6A3BEB4C-D116-481E-B98D-4779246C4B02 6A3BEB4C-D116-481E-B98D-4779246C4B02 3           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02
6A3BEB4C-D116-481E-B98D-4779246C4B04 Jack       6A3BEB4C-D116-481E-B98D-4779246C4B03 6A3BEB4C-D116-481E-B98D-4779246C4B03 4           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02|6A3BEB4C-D116-481E-B98D-4779246C4B03
6A3BEB4C-D116-481E-B98D-4779246C4B05 Daniel     6A3BEB4C-D116-481E-B98D-4779246C4B03 6A3BEB4C-D116-481E-B98D-4779246C4B03 4           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02|6A3BEB4C-D116-481E-B98D-4779246C4B03
6A3BEB4C-D116-481E-B98D-4779246C4B07 Ian        6A3BEB4C-D116-481E-B98D-4779246C4B06 6A3BEB4C-D116-481E-B98D-4779246C4B06 4           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02|6A3BEB4C-D116-481E-B98D-4779246C4B06
6A3BEB4C-D116-481E-B98D-4779246C4B08 Helen      6A3BEB4C-D116-481E-B98D-4779246C4B06 6A3BEB4C-D116-481E-B98D-4779246C4B06 4           6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B0D|6A3BEB4C-D116-481E-B98D-4779246C4B02|6A3BEB4C-D116-481E-B98D-4779246C4B06

(12 row(s) affected)

添加一些创建和填充一些测试数据以及预期结果集的tsql如何?My Id和parentID Id都是uniqueidentifier字段,我得到以下错误。Msg 291,级别16,状态1,第5行强制转换或转换:为类型“uniqueidentifier”+1指定的属性无效。远比光标好。但是,那么,我认为诅咒是撒旦发明的…非常感谢你。它就像一个符咒。再次感谢。正如你所说的,游标将是我的最后一个选择,我想尝试上面的解决方案,看起来它会起作用。谢谢你的回复。