Possiamo avere più "WITH AS" in un singolo sql - Oracle SQL


102

Avevo una domanda molto semplice: Oracle consente più "WITH AS" in una singola istruzione sql.

Esempio:

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

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

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

Posso far funzionare la query ripetendo la stessa query più volte, ma non voglio farlo e sfruttare "WITH AS". Sembra un requisito semplice ma oracle non mi permette:

ORA-00928: parola chiave SELECT mancante

Risposte:


190

Puoi farlo come:

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
Possiamo usare l'alias dalla prima sottoquery alla seconda sottoquery? In questo caso le sottoquery abce xyz? Devo ottenere il risultato della prima sottoquery e usarlo nella seconda sottoquery.
Cera

@Wax Sono in grado di utilizzare gli alias della prima sottoquery nella seconda sottoquery senza problemi, proprio come suggerisce la risposta sopra. Sono stato anche in grado di utilizzare alias e colonne di entrambe le tabelle nella query principale.
cleberz

Risposta perfetta.
InfiniteFlash

29

la sintassi corretta è -

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
"Puoi accedere anche alle colonne di t1 qui" è stato molto utile sottolineare.
Bren

10

Si, puoi...

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

Seguire l'ordine in cui dovrebbe essere inizializzato in Common Table Expressions


3

Aditya o altri, puoi unirti o abbinare t2 con t1 nel tuo esempio, cioè tradotto nel mio codice,

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

Non è chiaro se solo WHERE è supportato per l'adesione o quale approccio di unione è supportato all'interno della 2a entità WITH. Alcuni degli esempi hanno WHERE A = B in basso nel corpo della selezione "sotto" le clausole WITH.

L'errore che ottengo seguendo queste dichiarazioni WITH è che gli identificatori (nomi di campo) in B non sono riconosciuti, in basso nel corpo del resto dell'SQL. Quindi la sintassi WITH sembra funzionare correttamente, ma non è possibile accedere ai risultati da t2.


È necessario alia t1 all'interno del t2 con clausola
Ben

Come posso fare riferimento alla tabella delle clausole all'interno della sottoquery? sta generando un errore. per esempio, WITH SET1 AS (SELECT SYSDATE FROM DUAL), - SET1 inizializzato SET2 AS (SELECT * FROM SET1) - SET1 accede SELECT * FROM SET2 LEFT OUTER JOIN (seleziona * da SET1 dove sysdate = now ()) set3 su set1.sysdate = set3.sysdate;
Rupasa Sushma,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.