可以像在CTE2中使用CTE1结果一样在另一个CTE中调用CTE吗?

时间:2019-02-12 14:26:12

标签: sql oracle common-table-expression oracle12c

示例是  假设:

 with CTE1 as (select col1 from t1) select * from CTE1;
    with CTE2 as (select col2 from t2 where col2=col1)
    select * from CTE2;

这可能吗? 我尝试了很少的代码,但没有用。  请帮助我。

1 个答案:

答案 0 :(得分:5)

CTE仅存在于定义它的查询中。您的第二个查询不知道来自第一个查询的CTE。

您可以从另一个引用一个CTE,只要它们都属于同一查询(并以正确的顺序定义),那么您可以执行以下操作:

with CTE1 as (select t1.col1 from t1),
     CTE2 as (select t2.col2 from CTE1 join t2 on t2.col2=CTE1.col1)
select * from CTE2;

两个CTE定义用逗号分隔(如in the docs),顺序很重要。在那个相当人为的示例中,您可以从CTE2引用CTE1。但您无法从CTE1引用CTE2,因为就解析器而言,尚未定义它。

即使其中一个已经引用了另一个CTE,主查询也可以引用一个或两个CTE。您可以用相同的方式将两个以上的CTE链接在一起。