sql - 单个 select 语句中的多个 cte,其中 ctes 可以相互引用

标签 sql sql-server common-table-expression

扩展以下问题 ( Multiple Select Statement ) 我想知道我是否可以执行以下操作:

WITH 
    cte1 as (
      SELECT * from cdr.Location
    ),
    cte2 as (
      SELECT * from cdr.Location
        WHERE cdr.Location.someField = cte1.SomeField
    )
select * from cte1 union select * from cte2

所以这里的重音在下面一行:

 WHERE cdr.Location.someField = cte1.SomeField

我在 cte2 中的哪个位置引用了 cte1?

最佳答案

是的,您可以在后续 CTE 中引用之前声明的 CTE:

WITH cte1 as (
  SELECT t.* 
    FROM cdr.Location t),
     cte2 as (
  SELECT t.* 
    FROM cdr.Location t
    JOIN cte1 c1 ON c1.somefield = t.someField)
SELECT * 
  FROM cte1 
UNION 
SELECT * 
  FROM cte2

注意事项

  1. 在 cte1 声明中加入 cte2 是行不通的,因为该语句是自上而下执行的。
  2. 您可以像任何其他内联 View (它是)或表/临时表/等一样通过 JOINing 引用您需要的任何内容。

顺便说一句:尝试在未来制定一个更好的示例 - 这对您和试图帮助您的 SO 社区的其他成员都有好处。

关于sql - 单个 select 语句中的多个 cte,其中 ctes 可以相互引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641097/

相关文章:

sql - CTE、ROW_NUMBER 和 ROWCOUNT

mysql - SQL外键错误?

php - 虽然php中的嵌套循环从sql数据库中获取数据

sql - 如何按multipart X.Y[.Z] "version"数字对查询结果进行排序?

sql-server - 如何在 SQL Server 部署期间不禁用触发器

sql - 创建与列值出现相关的计算列

sql - 如何获得CTE结果的计数?

sql - SQL或Access中的排序表

sql - 从函数执行存储过程

sql - 在 With 语句中选择 Null