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

kru*_*rul 2 sql sql-server common-table-expression

扩展以下问题(多选语句)我想知道我是否可以执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

所以这里的重点在于以下几行:

 WHERE cdr.Location.someField = cte1.SomeField
Run Code Online (Sandbox Code Playgroud)

在cte2中哪里我引用cte1?

OMG*_*ies 9

是的,您可以在随后的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
Run Code Online (Sandbox Code Playgroud)

笔记

  1. 在cte1声明中加入cte2是行不通的,因为该语句是从上到下执行的.
  2. 您可以通过JOINing引用CTE,就像任何其他内联视图(它是)或table/temp table/etc一样.

顺便说一句:尝试在未来制定一个更好的例子 - 这对你和其他想要帮助你的SO社区都有好处.