我正在尝试编写一个递归CTE,它引用了之前写的另一个CTE。
第一个cte nodes
在编写递归Hierarchy
cte之前我用分号关闭了:
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)
我收到错误:
Msg 102,Level 15,State 1,Line 17'''附近的语法不正确。
当我删除分号时,我收到错误:
消息156,级别15,状态1,行19关键字附近的语法不正确 “用”。
Msg 319,Level 15,State 1,Line 19附近的语法不正确 关键字'with'。 如果此语句是公用表表达式,则为 xmlnamespaces子句或更改跟踪上下文子句,以前的子句 声明必须以分号终止。
...我不经常写CTE(更不用说递归)了,所以我不太清楚如何解决与;
位置的明显冲突。
答案 0 :(得分:5)
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)
答案 1 :(得分:2)
您只能在语句末尾使用结束分号。所有CTE都形成一个单一的陈述。在单个语句中使用多个CTE时,请使用逗号分隔每个CTE。
WITH nodes(node, node_name, parent, parent_name) AS
...
), Hierarchy(node, node_name, depth, parent, parent_name) AS (
...
)
SELECT ...
OPTION (MAXRECURSION 32767);
注意末尾的分号。您应该养成包含此习惯的习惯,因为将来会有更多语句需要它(例如,MERGE语句必须使用分号终止)。