¿Cómo puedo tener varias expresiones de tabla comunes en una sola instrucción SELECT?


Estoy en el proceso de simplificar una instrucción select complicada, así que pensé en usar expresiones de tabla comunes.

Declarar un único cte funciona bien.

WITH cte1 AS (
    SELECT * from cdr.Location
    )

select * from cte1 

¿Es posible declarar y utilizar más de un cte en la misma SELECCIÓN?

Es decir, este sql da un error

WITH cte1 as (
    SELECT * from cdr.Location
)

WITH cte2 as (
    SELECT * from cdr.Location
)

select * from cte1    
union     
select * from cte2

El error es

Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'WITH'.
Msg 319, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

NB. He intentado poner punto y coma y obtener este error

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.
Msg 102, Level 15, State 1, Line 9
Incorrect syntax near ';'.

Probablemente no es relevante, pero esto es en SQL 2008.

Author: Scotty.NET, 2009-02-25

2 answers

Creo que debería ser algo como:

WITH 
    cte1 as (SELECT * from cdr.Location),
    cte2 as (SELECT * from cdr.Location)
select * from cte1 union select * from cte2

Básicamente, WITH es solo una cláusula aquí, y como las otras cláusulas que toman listas, "," es el delimitador apropiado.

 121
Author: MarkusQ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-05 13:24:19

La respuesta arriba mencionada es correcta:

WITH 
    cte1 as (SELECT * from cdr.Location),
    cte2 as (SELECT * from cdr.Location)
select * from cte1 union select * from cte2

Adicionalmente, también puede consultar desde cte1 en cte2:

WITH 
    cte1 as (SELECT * from cdr.Location),
    cte2 as (SELECT * from cte1 where val1 = val2)

select * from cte1 union select * from cte2

val1,val2 son solo asunciones para expresiones..

Espero que este blog también ayude : http://iamfixed.blogspot.de/2017/11/common-table-expression-in-sql-with.html

 13
Author: Sagar Dev Timilsina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-14 19:46:10