¿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

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*/

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;

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


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.