1つの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」を利用します。単純な要件のように見えますが、オラクルは私を許可していません:

ORA-00928:SELECTキーワードがありません

回答:


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
最初のサブクエリから2番目のサブクエリへのエイリアスを使用できますか?この場合、abcおよびxyzサブクエリ?最初のサブクエリの結果を取得して、2番目のサブクエリで使用する必要があります。
2017

@Wax上記の答えが示唆するように、最初のサブクエリのエイリアスを2番目のサブクエリで問題なく使用できます。また、メインクエリで両方のテーブルのエイリアスと列を使用することもできました。
cleberz 2018年

完璧な答え。
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のみがサポートされているかどうか、または2番目のWITHエンティティ内でサポートされている結合方法は不明です。一部の例では、WITH句の「下」にあるselectの本文にWHERE A = Bが含まれています。

これらのWITH宣言に従っているエラーは、Bの識別子(フィールド名)が認識されず、残りのSQL本体で認識されないことです。したがって、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 where sysdate = now())set3 on set1.sysdate = set3.sysdate;
Rupasa Sushma
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.