小编典典

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

sql

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

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?


阅读 191

收藏
2021-04-28

共1个答案

小编典典

是的,您可以在后续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. 您可以根据需要使用JOINing来引用CTE,就像引用任何其他内联视图(它)或table / temp table / etc一样。

顺便说一句:尝试在将来树立更好的榜样-这对您和所有试图帮助您的SO社区其他成员都是有益的。

2021-04-28