web-dev-qa-db-ja.com

単一のSELECTステートメントに複数の共通テーブル式を含めるにはどうすればよいですか?

私は複雑な選択ステートメントを単純化する過程にあるので、一般的なテーブル式を使用すると思いました。

単一のcteを宣言するとうまくいきます。

WITH cte1 AS (
    SELECT * from cdr.Location
    )

select * from cte1 

同じSELECTで複数のcteを宣言して使用することはできますか?

すなわち、この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にあります。

89
Paul Rowland

私はそれが次のようなものであるべきだと思う:

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

基本的に、WITHは単なる句であり、リストを取る他の句と同様に、「、」が適切な区切り文字です。

131
MarkusQ

上記の答えは正しいです:

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

さらに、cte2のcte1からクエリを実行することもできます。

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

14