Podemos ter vários “COM AS” em um único sql - Oracle SQL

102

Eu tinha uma pergunta muito simples: O oracle permite vários "WITH AS" em uma única instrução sql.

Exemplo:

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

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

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

Posso fazer a consulta funcionar repetindo a mesma consulta várias vezes, mas não quero fazer isso e aproveitar "COM AS". Parece um requisito simples, mas o oracle não me permite:

ORA-00928: palavra-chave SELECT ausente

user1933888
fonte

Respostas:

190

Você pode fazer isso como:

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
fonte
2
Podemos usar o alias da primeira subconsulta para a segunda subconsulta? Neste caso, as subconsultas abce xyz? Preciso obter o resultado da primeira subconsulta e usá-lo na segunda subconsulta.
Cera de
@Wax Consigo usar os aliases da primeira subconsulta na segunda subconsulta sem problemas, como a resposta acima sugere. Também consegui usar aliases e colunas de ambas as tabelas na consulta principal.
cleberz
Resposta perfeita.
InfiniteFlash
29

a sintaxe correta é -

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
fonte
5
"você pode acessar colunas de t1 aqui também" foi muito útil apontar.
Bren,
10

Sim você pode...

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

Siga a ordem em que deve ser inicializado em Expressões de tabela comuns

SriniV
fonte
3

Aditya ou outros, você pode juntar ou combinar t2 com t1 em seu exemplo, isto é, traduzido para o meu código,

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

Não estou claro se apenas WHERE é compatível com a associação ou qual abordagem de associação é compatível com a segunda entidade COM. Alguns dos exemplos têm WHERE A = B no corpo do select "abaixo" das cláusulas WITH.

O erro que estou recebendo após essas declarações WITH é que os identificadores (nomes de campo) em B não são reconhecidos, no corpo do restante do SQL. Portanto, a sintaxe WITH parece funcionar bem, mas não pode acessar os resultados de t2.

Dave
fonte
Você precisa alia t1 dentro do t2 com cláusula
Ben
Como posso fazer referência à tabela de cláusulas dentro da subconsulta? está gerando um erro. por exemplo, WITH SET1 AS (SELECT SYSDATE FROM DUAL), - SET1 inicializado SET2 AS (SELECT * FROM SET1) - SET1 acessado SELECT * FROM SET2 LEFT OUTER JOIN (selecione * de SET1 onde sysdate = agora ()) set3 em set1.sysdate = set3.sysdate;
Rupasa Sushma