2013-10-29 12 views
48

Ho una domanda molto semplice: oracle consente più "WITH AS" in una singola istruzione sql.Possiamo avere più "WITH AS" in singolo sql - Oracle SQL

Esempio:

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

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

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

posso fare il lavoro di query ripetendo la stessa query più volte, ma non voglio farlo, e leva "CON L'AS". Sembra un semplice requisito, ma Oracle non mi consente:

ORA-00928: manca SELEZIONA parola chiave

risposta

84

È possibile 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*/ 
+1

Possiamo usare alias dalla prima subquery alla seconda subquery? In questo caso le subquery 'abc' e' xyz'? Ho bisogno di ottenere il risultato della prima subquery e usarlo nella seconda subquery. – Wax

+0

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

19

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; 
+3

"puoi anche accedere alle colonne di t1" è stato molto utile segnalarlo. – Bren

5

Sì, è possibile ...

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 espressioni di tabella comuni

3

Aditya o altri, si può aderire o abbinare T2 con t1 nel tuo esempio, cioè tradotto al 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 sono chiaro se solo WHERE è supportato per l'adesione, o quale approccio di join è supportato all'interno dell'entità 2nd WITH. Alcuni degli esempi hanno il WHERE A = B in basso nel corpo della selezione "sotto" le clausole WITH.

L'errore che sto ottenendo seguendo queste dichiarazioni WITH è l'identificatore (i nomi dei campi) in B non sono riconosciuti, nel corpo del resto dell'SQL. Quindi la sintassi WITH sembra funzionare correttamente, ma non può accedere ai risultati di t2.