Mat*_*all 2 sql t-sql common-table-expression
我正在尝试编写一个递归CTE,它引用了之前编写的另一个CTE.
第一CTE nodes我已经封闭了与分号写递归前HierarchyCTE:
WITH nodes(node, node_name, parent, parent_name) AS
(
SELECT
Grp.PermissionGroupID as node,
Grp.GroupName as node_name,
GrpLink.ParentPermissionGroupID as parent,
ParentGrp.GroupName as parent_name
FROM _CCC_Permission_Group Grp
LEFT JOIN _CCC_Permission_GroupGroup GrpLink
on Grp.PermissionGroupID = GrpLink.ChildPermissionGroupID
LEFT JOIN _CCC_Permission_Group ParentGrp
on GrpLink.ParentPermissionGroupID = ParentGrp.PermissionGroupID
);
WITH Hierarchy(node, node_name, depth, parent, parent_name)
AS
(
SELECT
node,
node_name,
0,
parent,
parent_name
FROM nodes as FirstDepth
WHERE parent IS NULL
UNION ALL
SELECT
NextDepth.node,
NextDepth.node_name,
Parent.depth + 1,
Parent.parent,
Parent.parent_name
FROM nodes as NextDepth
INNER JOIN Hierarchy as Parent
on NextDepth.parent = Parent.parent
)
SELECT *
FROM Hierarchy
OPTION (MAXRECURSION 32767)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
消息102,级别15,状态1,行17'''附近的语法不正确.
当我删除分号时,我得到错误:
消息156,级别15,状态1,行19关键字"WITH"附近的语法不正确.
消息319,级别15,状态1,行19关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句.
...我不经常写CTE(更不用说递归)了,所以我不太清楚如何解决这种与;放置的明显冲突.
A CTE只需要一个WITH条款.您可以stacked CTE通过在前一个末尾添加逗号CTE后跟CTE名称来创建
;WITH nodes(node, node_name, parent, parent_name) AS
(
....
),Hierarchy(node, node_name, depth, parent, parent_name)
AS
(
..
)
SELECT *
FROM Hierarchy
OPTION (MAXRECURSION 32767)
Run Code Online (Sandbox Code Playgroud)