Können wir mehrere "WITH AS" in einer einzigen SQL haben - Oracle SQL


102

Ich hatte eine sehr einfache Frage: Erlaubt Oracle mehrere "WITH AS" in einer einzigen SQL-Anweisung?

Beispiel:

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

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

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

Ich kann die Abfrage zum Laufen bringen, indem ich dieselbe Abfrage mehrmals wiederhole, möchte dies aber nicht, und "WITH AS" nutzen. Es scheint eine einfache Anforderung zu sein, aber Orakel erlaubt mir nicht:

ORA-00928: Schlüsselwort SELECT fehlt

Antworten:


189

Sie können dies tun als:

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
Können wir einen Alias ​​von der ersten zur zweiten Unterabfrage verwenden? In diesem Fall die abcund xyzUnterabfragen? Ich muss das Ergebnis der ersten Unterabfrage abrufen und es für die zweite Unterabfrage verwenden.
Wachs

@Wax Ich kann die Aliase aus der ersten Unterabfrage in der zweiten Unterabfrage problemlos verwenden, genau wie die obige Antwort nahelegt. Ich konnte auch Aliase und Spalten aus beiden Tabellen in der Hauptabfrage verwenden.
Cleberz

Perfekte Antwort.
InfiniteFlash

29

Die richtige Syntax lautet -

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
"Sie können auch hier auf Spalten von t1 zugreifen" war sehr hilfreich, um darauf hinzuweisen.
Bren

10

Ja, du kannst...

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

Befolgen Sie die Reihenfolge, in der es in Common Table Expressions initialisiert werden soll


3

Aditya oder andere, können Sie t2 mit t1 in Ihrem Beispiel verbinden oder abgleichen, dh in meinen 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)

Mir ist nicht klar, ob nur WO für den Beitritt unterstützt wird oder welcher Beitrittsansatz innerhalb der 2. WITH-Entität unterstützt wird. Einige der Beispiele haben das WHERE A = B im Hauptteil der Auswahl "unter" den WITH-Klauseln.

Der Fehler, den ich beim Befolgen dieser WITH-Deklarationen erhalte, ist, dass die Bezeichner (Feldnamen) in B im Hauptteil des restlichen SQL nicht erkannt werden. Die WITH-Syntax scheint also in Ordnung zu sein, kann jedoch nicht auf die Ergebnisse von t2 zugreifen.


Sie müssen unter anderem t1 innerhalb der t2 mit Klausel
Ben

Wie kann ich mit der Klauseltabelle in der Unterabfrage verweisen? es wirft einen Fehler. Beispiel: MIT SET1 AS (SELECT SYSDATE FROM DUAL), - SET1 initialisiert SET2 AS (SELECT * FROM SET1) - SET1 hat auf SELECT * FROM SET2 LEFT OUTER JOIN zugegriffen (wählen Sie * aus SET1, wobei sysdate = now ()) set3 on set1.sysdate = set3.sysdate;
Rupasa Sushma
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.