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

时间:2009-10-29 01:09:58

标签: 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?

1 个答案:

答案 0 :(得分:8)

是的,您可以在随后的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. 您可以通过加入任何您需要的内容来引用CTE,就像任何其他内联视图(它是)或表/临时表/等一样。
  3. 顺便说一下:尝试在未来制定一个更好的例子 - 这对你和其他想要帮助你的SO社区都有好处。