递归公用表表达式(CTE)引用不允许提示。考虑从递归CTE参考中删除提示' CTE'

时间:2016-10-19 11:09:21

标签: sql-server tsql common-table-expression recursive-query

我这里有一个Employee表是表结构

Name    varchar
GUID    numeric
ParentGUID  numeric

这是一些示例数据

NAME GUID ParentGUID
ABC    1   NULL
BCD    2   1
xyz    3   2
PQR    4   2
MRS    5   3

此表包含Employee和manager的大型层次结构。 我需要选择特定员工下的所有员工。 防爆。我需要所有受BCD影响的员工,所以结果应该是

 xyz    3   2
 PQR    4   2

这是我的递归查询。

;WITH CTE (Name, GUID, ParentGUID)
    AS
    (
    select distinct B.Name , B.GUID,  B.ParentGUID
    FROM 
    EMP B with (nolock)     

    union All

    select a.Name , a.GUID, a.ParentGUID
    FROM EMP a with (nolock)
    inner join CTE C with (nolock)  on a.ParentGUID = c.GUID
    )
    select *
    FROM CTE B with (nolock)     where B.Name in ('BCD')

但它给了我错误。

Msg 4150, Level 16, State 1, Line 1
Hints are not allowed on recursive common table expression (CTE) references. Consider removing hint from recursive CTE reference 'CTE'.

你们有没有人可以帮我纠正这个问题。

1 个答案:

答案 0 :(得分:1)

您的where B.Name in ('BCD')是将结果集过滤到一行的内容。将其更改为以下内容,您应该得到您想要的结果:

;with cte (Name, GUID, ParentGUID)
    as
    (
    select distinct B.Name
                   ,B.GUID
                   ,B.ParentGUID
    from EMP B
    where B.Name in ('BCD')

    union All

    select a.Name
          ,a.GUID
          ,a.ParentGUID
    from EMP a
        inner join CTE C
            on a.ParentGUID = c.GUID
    )
    select *
    from CTE