Как я могу иметь несколько общих табличных выражений в одном операторе SELECT?



Я нахожусь в процессе упрощения сложного оператора select, поэтому думал, что буду использовать общие табличные выражения.



объявление одного cte работает нормально.



WITH cte1 AS (
SELECT * from cdr.Location
)

select * from cte1


можно ли объявить и использовать более одного cte в том же SELECT?



т. е. этот sql выдает ошибку



WITH cte1 as (
SELECT * from cdr.Location
)

WITH cte2 as (
SELECT * from cdr.Location
)

select * from cte1
union
select * from cte2


ошибка



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. Я попытался поставить точку с запятой и получить эту ошибку



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


вероятно, не имеет значения но это на SQL 2008.

619   2  

2 ответов:

Я думаю, что это должно быть что-то вроде:

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

по сути, WITH это просто предложение здесь, и, как и другие предложения, которые принимают списки,", " является соответствующим разделителем.

вышеупомянутый ответ правильный:

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

Aditionally, вы также можете запросить из cte1 в 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 являются такими же предположениями для выражений..

надеюсь, что этот блог также поможет : http://iamfixed.blogspot.de/2017/11/common-table-expression-in-sql-with.html

Comments

    Ничего не найдено.