您可以为公用表表达式创建嵌套的WITH子句吗?

Joe*_*ips 168 sql t-sql sql-server nested common-table-expression

WITH y AS (
    WITH x AS (
        SELECT * FROM MyTable
    )
    SELECT * FROM x
)
SELECT * FROM y
Run Code Online (Sandbox Code Playgroud)

这样的事情有用吗?我之前尝试过,但我无法让它发挥作用.

spe*_*der 277

虽然没有严格嵌套,但您可以使用公用表表达式重用以后的查询.

为此,您要查找的语句的形式将是

WITH x AS 
(
    SELECT * FROM MyTable
), 
y AS 
(
    SELECT * FROM x
)
SELECT * FROM y
Run Code Online (Sandbox Code Playgroud)

  • 本质上,帖子意味着*你不能做到*,但这不是一个大问题. (7认同)
  • 这不是嵌套的 (5认同)
  • 声明这不是嵌套的,仅仅因为查询 2 不在查询 1 的括号内,这听起来像是一个弱参数。我认为它是嵌套的(不是递归嵌套的),因为查询 2 使用查询 1 的结果,这也发生在嵌套中。是否定义嵌套只能在子项位于括号(或类似)符号内时进行? (3认同)
  • 非常感谢你.我能够在Oracle中完成它:WITH J AS(SELECT 1 AS ONE FROM DUAL),Q AS(SELECT J.*,2 AS两个来自J)SELECT*FROM Q (2认同)
  • 是的,这是一个可以接受的答案,因为我试图通过嵌套实现的目标与最终给我的结果是一样的 (2认同)
  • 它更类似于链接,但无论如何。它以简单易读的方式完成了工作并为我解决了类似的问题。 (2认同)

Dav*_*res 9

您可以执行以下操作,称为递归查询:

WITH y
AS
(
  SELECT x, y, z
  FROM MyTable
  WHERE [base_condition]

  UNION ALL

  SELECT x, y, z
  FROM MyTable M
  INNER JOIN y ON M.[some_other_condition] = y.[some_other_condition]
)
SELECT *
FROM y
Run Code Online (Sandbox Code Playgroud)

您可能不需要此功能.为了更好地组织我的查询,我已经完成了以下操作:

WITH y 
AS
(
  SELECT * 
  FROM MyTable
  WHERE [base_condition]
),
x
AS
(
  SELECT * 
  FROM y
  WHERE [something_else]
)
SELECT * 
FROM x
Run Code Online (Sandbox Code Playgroud)


Adr*_*der 6

与嵌入不起作用,但它确实连续工作

;WITH A AS(
...
),
B AS(
...
)
SELECT *
FROM A
UNION ALL
SELECT *
FROM B
Run Code Online (Sandbox Code Playgroud)

编辑 修正了语法...

另外,请看下面的示例

SQLFiddle DEMO