web-dev-qa-db-fra.com

Comment puis-je avoir plusieurs expressions de table communes dans une seule instruction SELECT?

Je suis en train de simplifier une instruction select compliquée, alors j'ai pensé utiliser des expressions de table courantes.

Déclarer un seul cte fonctionne très bien.

WITH cte1 AS (
    SELECT * from cdr.Location
    )

select * from cte1 

Est-il possible de déclarer et d'utiliser plus d'un cte dans le même SELECT?

c'est à dire que ce sql donne une erreur

WITH cte1 as (
    SELECT * from cdr.Location
)

WITH cte2 as (
    SELECT * from cdr.Location
)

select * from cte1    
union     
select * from cte2

l'erreur est

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. J'ai essayé de mettre des points-virgules et d'obtenir cette erreur

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

Probablement pas pertinent mais c'est sur SQL 2008.

89
Paul Rowland

Je pense que cela devrait être quelque chose comme:

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

Fondamentalement, WITH n'est qu'une clause ici, et comme les autres clauses qui prennent des listes, "," est le délimiteur approprié.

131
MarkusQ

La réponse mentionnée ci-dessus est juste:

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

De plus, vous pouvez également interroger à partir de cte1 dans 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 ne sont que des hypothèses pour les expressions ..

J'espère que ce blog vous aidera également: http://iamfixed.blogspot.de/2017/11/common-table-expression-in-sql-with.html

14