嵌套 - 关键字“WITH”附近的语法不正确

1 sql-server

与内与

还行吧

    WITH CS AS (
      SELECT      'ab' as a
    )
    SELECT * from cs
Run Code Online (Sandbox Code Playgroud)

http://data.stackexchange.com/mathematics/revision/138658/170321/comment-partition-by-question

但是,一旦我用第二个包裹它with

with PS as (
        WITH CS AS (
          SELECT      'ab' as a
        )
        SELECT * from cs
        ) select * from PS
Run Code Online (Sandbox Code Playgroud)

我收到这个错误,

Incorrect syntax near the keyword 'WITH'. Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon. Incorrect syntax near ')'.

带内选择

下面就ok了

select ab.a from (
  select a from (SELECT 'ab' as a) b
            ) ab
Run Code Online (Sandbox Code Playgroud)

这也是运行

  with cs as (SELECT 'ab' as a)
  select a from cs
Run Code Online (Sandbox Code Playgroud)

但是,用另一个选择包装表达式,正如这个提议的那样

  select a from (
    with cs as (SELECT 'ab' as a)
    select a from cs
  ) ab
Run Code Online (Sandbox Code Playgroud)

再次失败并出现相同的错误。

我在 data.stackexchange 中这样做,他们报告说他们使用 MSSQL

a1e*_*x07 5

文档

不允许在 CTE 中指定多个 WITH 子句。例如,如果 CTE_query_definition 包含子查询,则该子查询不能包含定义另一个 CTE 的嵌套 WITH 子句。

因此,

with PS as (
    WITH CS AS (
      SELECT      'ab' as a
    )
    SELECT * from cs
    ) select * from PS
Run Code Online (Sandbox Code Playgroud)

给你错误。您可以定义多个 CTE:

WITH CS AS (SELECT 'ab' as a),
PS as (SELECT * from cs) 
select * from PS
Run Code Online (Sandbox Code Playgroud)