2013-10-29 8 views
48

Ich hatte eine sehr einfache Frage: Erlaubt Oracle mehrere "WITH AS" in einer einzigen SQL-Anweisung.Können wir mehrere "WITH AS" in einzelnen SQL - Oracle SQL

Beispiel:

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

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

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

Ich kann die Abfrage funktioniert, indem die gleiche Abfrage mehrmals wiederholen, aber nicht will, das zu tun, und Hebelwirkung „mit AS“. Es scheint wie eine einfache Anforderung aber Orakel hat mir nicht erlaubt:

ORA-00928: SELECT Schlüsselwort fehlt

Antwort

84

Sie dies als tun:

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

Können wir Alias ​​von der ersten Unterabfrage bis zur zweiten Unterabfrage verwenden? In diesem Fall die Unterabfragen 'abc' und' xyz'? Ich muss das Ergebnis der ersten Unterabfrage erhalten und es für die zweite Unterabfrage verwenden. – Wax

+0

@Wax Ich bin in der Lage, die Aliase aus der ersten Unterabfrage in der zweiten Unterabfrage ohne Probleme zu verwenden, genau wie die obige Antwort vermuten lässt. Ich konnte auch Aliase und Spalten aus beiden Tabellen in der Hauptabfrage verwenden. – cleberz

19

die korrekte Syntax ist -

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

"Sie können auch hier auf Spalten von t1 zugreifen" war sehr hilfreich, um darauf hinzuweisen. – Bren

5

Ja können Sie ...

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 

Folgen Sie die Reihenfolge, in der es sollte in Common Table Expressions

3

Aditya oder andere initialisiert werden, können Sie t2 mit t1 in Ihrem Beispiel verbinden oder zusammenpassen, also zu meinem Code übersetzt,

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

Ich bin nicht klar, ob nur WHERE für den Beitritt unterstützt wird, oder welcher Fügeansatz innerhalb der 2. WITH Entität unterstützt wird. Einige der Beispiele haben den WHERE A = B down im Körper der Auswahl "unterhalb" der WITH-Klauseln.

Der Fehler, den ich nach diesen WITH-Deklarationen bekomme, ist, dass die Bezeichner (Feldnamen) in B nicht erkannt werden, im Körper des Rests der SQL. Daher scheint die WITH-Syntax OK zu sein, aber sie kann nicht auf die Ergebnisse von t2 zugreifen.