Czy możemy mieć wiele „Z AS” w jednym sql - Oracle SQL

102

Miałem bardzo proste pytanie: czy Oracle zezwala na wielokrotne wyrażenie „WITH AS” w jednej instrukcji sql.

Przykład:

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

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

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

Mogę sprawić, by zapytanie działało, powtarzając to samo zapytanie wiele razy, ale nie chcę tego robić, i wykorzystuję opcję „Z JAKĄ”. Wydaje się, że jest to prosty wymóg, ale wyrocznia nie pozwala mi:

ORA-00928: brak słowa kluczowego SELECT

user1933888
źródło

Odpowiedzi:

190

Możesz to zrobić jako:

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
źródło
2
Czy możemy użyć aliasu z pierwszego podzapytania do drugiego podzapytania? W tym przypadku podzapytania abci xyz? Muszę uzyskać wynik pierwszego podzapytania i użyć go w drugim podzapytaniu.
Wosk
@Wax Mogę bez problemu używać aliasów z pierwszego podzapytania w drugim podzapytaniu, tak jak sugeruje powyższa odpowiedź. Udało mi się również użyć aliasów i kolumn z obu tabel w głównym zapytaniu.
cleberz
Doskonała odpowiedź.
InfiniteFlash
29

poprawna składnia to -

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
źródło
5
„Możesz również uzyskać dostęp do kolumn t1 tutaj”.
Bren,
10

Tak, możesz...

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

Postępuj zgodnie z kolejnością, w jakiej powinien zostać zainicjowany w Common Table Expressions

SriniV
źródło
3

Aditya lub inni, czy możesz dołączyć lub dopasować t2 z t1 w twoim przykładzie, tj. Przetłumaczone na mój kod,

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

Nie jestem pewien, czy tylko GDZIE jest obsługiwane w przypadku łączenia, czy też jakie podejście do łączenia jest obsługiwane w ramach drugiego podmiotu WITH. Niektóre z przykładów mają WHERE A = B w treści zaznaczenia „poniżej” klauzul WITH.

Błąd, który otrzymuję po tych deklaracjach Z jest taki, że identyfikatory (nazwy pól) w B nie są rozpoznawane, w treści reszty kodu SQL. Tak więc składnia WITH wydaje się działać poprawnie, ale nie ma dostępu do wyników z t2.

Dave
źródło
Musisz alia t1 w t2 z klauzulą
Ben
Jak mogę odwołać się do tabeli klauzul w kwerendzie sub? zgłasza błąd. na przykład Z SET1 AS (SELECT SYSDATE FROM DUAL), - SET1 zainicjowany SET2 AS (SELECT * FROM SET1) - SET1 uzyskał dostęp do SELECT * FROM SET2 LEFT OUTER JOIN (wybierz * z SET1, gdzie sysdate = now ()) set3 on set1.sysdate = set3.sysdate;
Rupasa Sushma