我们可以在单个sql中包含多个“ WITH AS”-Oracle SQL


102

我有一个非常简单的问题:oracle在单个sql语句中是否允许多个“ WITH AS”。

例:

WITH abc AS( select ......)

WITH XYZ AS(select ....) /*This one uses "abc" multiple times*/

Select ....   /*using XYZ multiple times*/

我可以通过重复多次相同的查询来使查询工作,但是不想这样做,并利用“ WITH AS”。这似乎是一个简单的要求,但是oracle不允许我:

ORA-00928:缺少SELECT关键字

Answers:


190

您可以这样做:

WITH abc AS( select
             FROM ...)
, XYZ AS(select
         From abc ....) /*This one uses "abc" multiple times*/
  Select 
  From XYZ....   /*using abc, XYZ multiple times*/

2
我们可以使用第一个子查询到第二个子查询的别名吗?在这种情况下,abcxyz子查询?我需要获取第一个子查询的结果,并在第二个子查询上使用它。

@Wax我可以毫无问题地使用第二个子查询中第一个子查询的别名,就像上面的答案所示。我还能够在主查询中使用两个表中的别名和列。
cleberz

完美的答案。
InfiniteFlash

29

正确的语法是-

with t1
as
(select * from tab1
where conditions...
),
t2
as
(select * from tab2
where conditions...
(you can access columns of t1 here as well)
)
select * from t1, t2
where t1.col1=t2.col2;

5
指出:“您也可以在此处访问t1的列”。
布伦

10

是的你可以...

WITH SET1 AS (SELECT SYSDATE FROM DUAL), -- SET1 initialised
     SET2 AS (SELECT * FROM SET1)        -- SET1 accessed
SELECT * FROM SET2;                      -- SET2 projected

10/29/2013 10:43:26 AM

遵循在公共表表达式中应初始化的顺序


3

Aditya或其他人,您能否在示例中将t2与t1结合或匹配,即翻译为我的代码,

with t1 as (select * from AA where FIRSTNAME like 'Kermit'),
     t2 as (select * from BB B join t1 on t1.FIELD1 = B.FIELD1)

我不清楚是否仅支持WHERE进行联接,或者第二个WITH实体内仅支持哪种联接方法。在某些示例中,WITH子句下面的select主体中有WHERE A = B。

在这些WITH声明之后,我得到的错误是在其余SQL主体中无法识别B中的标识符(字段名称)。因此,WITH语法似乎运行正常,但无法访问t2的结果。


你需要与子句T2内特别T1

如何在子查询中引用子句表?引发错误。例如,WITH SET1 AS(SELECT SYSDATE FROM DUAL),-SET1初始化SET2 AS(SELECT * FROM SET1)-SET1访问SELECT * FROM SET2 LEFT OUTER JOIN(SELECT * FROM SET1其中sysdate = now())set3 on set1.sysdate = set3.sysdate;
Rupasa Sushma
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.