Bisakah kita memiliki beberapa "WITH AS" dalam satu sql - Oracle SQL

102

Saya punya pertanyaan yang sangat sederhana: Apakah oracle memungkinkan beberapa "DENGAN AS" dalam satu pernyataan sql.

Contoh:

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

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

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

Saya dapat membuat kueri tersebut bekerja dengan mengulangi kueri yang sama beberapa kali, tetapi tidak ingin melakukannya, dan memanfaatkan "DENGAN AS". Sepertinya persyaratan sederhana tetapi oracle tidak mengizinkan saya:

ORA-00928: kata kunci SELECT tidak ada

pengguna1933888
sumber

Jawaban:

190

Anda dapat melakukan ini sebagai:

WITH abc AS( select
             FROM ...)
, XYZ AS(select
         From abc ....) /*This one uses "abc" multiple times*/
  Select 
  From XYZ....   /*using abc, XYZ multiple times*/
Deepshikha
sumber
2
Bisakah kita menggunakan alias dari subkueri pertama ke subkueri kedua? Dalam hal ini, abcdan xyzsubkueri? Saya perlu mendapatkan hasil dari subkueri pertama dan menggunakannya pada subkueri kedua.
Lilin
@Wax Saya dapat menggunakan alias dari subkueri pertama di subkueri kedua tanpa masalah, seperti yang disarankan oleh jawaban di atas. Saya juga bisa menggunakan alias dan kolom dari kedua tabel di kueri utama.
cleberz
Jawaban yang sempurna.
InfiniteFlash
29

sintaks yang benar adalah -

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;
Aditya Kakirde
sumber
5
"Anda dapat mengakses kolom t1 di sini juga" sangat membantu untuk ditunjukkan.
Bren
10

Ya kamu bisa...

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

Ikuti urutan inisialisasi dalam Common Table Expressions

SriniV
sumber
3

Aditya atau orang lain, dapatkah Anda bergabung atau mencocokkan t2 dengan t1 di contoh Anda, yaitu diterjemahkan ke kode saya,

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

Saya tidak jelas apakah hanya WHERE yang didukung untuk bergabung, atau pendekatan bergabung apa yang didukung dalam entitas WITH ke-2. Beberapa contoh memiliki WHERE A = B di bagian tubuh pilih "di bawah" klausa WITH.

Kesalahan yang saya dapatkan setelah deklarasi WITH ini adalah pengidentifikasi (nama bidang) di B tidak dikenali, di bagian tubuh SQL lainnya. Jadi sintaks WITH berjalan OK, tetapi tidak dapat mengakses hasil dari t2.

Dave
sumber
Anda harus alia t1 dalam t2 dengan klausul
Ben
Bagaimana saya bisa mereferensikan dengan tabel klausa di dalam sub query? itu membuat kesalahan. misalnya DENGAN SET1 AS (PILIH SYSDATE DARI DUAL), - SET1 diinisialisasi SET2 AS (SELECT * FROM SET1) - SET1 diakses SELECT * FROM SET2 LEFT OUTER JOIN (pilih * dari SET1 di mana sysdate = now ()) set3 on set1.sysdate = set3.sysdate;
Rupasa Sushma