¿Podemos tener múltiples "CON AS" en un solo sql - Oracle SQL

102

Tenía una pregunta muy simple: ¿Oracle permite múltiples "CON COMO" en una sola declaración SQL?

Ejemplo:

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

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

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

Puedo hacer que la consulta funcione repitiendo la misma consulta varias veces, pero no quiero hacer eso y aprovechar "CON COMO". Parece un requisito simple pero Oracle no me permite:

ORA-00928: falta la palabra clave SELECT

user1933888
fuente

Respuestas:

190

Puede hacer esto 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
fuente
2
¿Podemos usar alias de la primera subconsulta a la segunda subconsulta? En este caso, las subconsultas abcy xyz? Necesito obtener el resultado de la primera subconsulta y usarlo en la segunda subconsulta.
Cera
@Wax Puedo usar los alias de la primera subconsulta en la segunda subconsulta sin ningún problema, tal como sugiere la respuesta anterior. También pude usar alias y columnas de ambas tablas en la consulta principal.
cleberz
Respuesta perfecta.
InfiniteFlash
29

la sintaxis correcta es -

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
fuente
5
"También puede acceder a las columnas de t1 aquí" fue muy útil señalar.
Bren
10

Sí tu puedes...

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 el orden en el que debe inicializarse en Expresiones de tabla comunes

SriniV
fuente
3

Aditya u otros, ¿pueden unirse o hacer coincidir t2 con t1 en su ejemplo, es decir, traducido a mi 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)

No tengo claro si solo se admite DÓNDE para unirse, o qué enfoque de unión se admite dentro de la segunda entidad WITH. Algunos de los ejemplos tienen WHERE A = B en el cuerpo de la selección "debajo" de las cláusulas WITH.

El error que recibo al seguir estas declaraciones WITH es que los identificadores (nombres de campo) en B no se reconocen, en el cuerpo del resto del SQL. Entonces, la sintaxis WITH parece funcionar bien, pero no puede acceder a los resultados de t2.

Dave
fuente
Necesita alia t1 dentro de t2 con cláusula
Ben
¿Cómo puedo hacer referencia con la tabla de cláusulas dentro de la subconsulta? está arrojando un error. por ejemplo, CON SET1 AS (SELECT SYSDATE FROM DUAL), - SET1 inicializado SET2 AS (SELECT * FROM SET1) - SET1 accedió SELECT * FROM SET2 LEFT OUTER JOIN (seleccione * from SET1 donde sysdate = now ()) set3 on set1.sysdate = set3.sysdate;
Rupasa Sushma