1. ホーム
  2. sql

[解決済み] 1つのSELECT文に複数の共通テーブル式を入れるには?

2023-01-12 17:44:44

質問

複雑な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 ';'.

おそらく関係ないと思いますが、これはSQL2008での話です。

どのように解決するのですか?

のような感じでいいんじゃないでしょうか。

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

基本的には WITH はここでは単なる節であり、リストを取る他の節と同様に "," が適切なデリミタとなります。