Redshift WITH句 documentation によると、INSERT INTO...SELECT
ステートメントでWITH句を使用できます。ただし、これをテストすると、以下のエラーが発生します。これは不可能ですか、それとも構文が間違っていますか?
CREATE TABLE TestCTEInsert (SomeTimestamp TIMESTAMP);
WITH CTE AS
(SELECT GETDATE() as SomeTimestamp)
INSERT INTO TestCTEInsert
(SomeTimestamp) SELECT SomeTimestamp from CTE;
エラー:42601:「挿入」またはその近くの構文エラー
興味深いことに、新しいテーブルへの挿入をサポートしています。
WITH CTE AS
(SELECT GETDATE() as SomeTimestamp)
INSERT SomeTimestamp INTO NewTable
SELECT SomeTimestamp from CTE;
コマンドは正常に完了しました(1行が影響を受けます)
EDIT:確認のために、INTEGER
ではなくTIMESTAMP
列を使用すると同じエラーが発生します。
CREATE TABLE TestCTE (SomeInt INTEGER);
WITH CTE AS
(SELECT 1 as SomeInt)
INSERT INTO TestCTEInsert
SELECT SomeInt from CTE;
エラー:42601:「挿入」またはその近くの構文エラー
CTEをインサートに入れてみてください(それがポイントを上回っているかどうかはわかりません)
INSERT INTO TestCTEInsert
WITH CTE AS
(SELECT CURRENT_TIMESTAMP as SomeTimestamp)
SELECT SomeTimestamp from CTE;
;
terminatesステートメントなので、ステートメントの途中ではなく、ステートメントの最後に配置する必要があります。
これは、create table as select
を使用する2つの方法で実行できます。
create table TestCTEInsert
as
WITH CTE AS
(
SELECT current_timestamp as SomeTimestamp
)
SELECT SomeTimestamp
from CTE; -- ; only at the end
または2つのステップで:
CREATE TABLE TestCTEInsert (SomeTimestamp TIMESTAMP); -- end this with a ;
insert into TestCTEInsert
WITH CTE AS
(
SELECT current_timestamp as SomeTimestamp
)
SELECT SomeTimestamp
from CTE; -- ; only at the end
上記はVanillaPostgresインストールで実行されますが、RDSにアクセスできません
スクリプトをこれに変更します
CREATE TABLE TestCTE (SomeInt INTEGER)
WITH CTE AS (SELECT 1 as SomeInt)
INSERT INTO TestCTE SELECT SomeInt from CTE;
これを試して
CREATE TABLE TestCTE (SomeInt INTEGER)
;WITH CTE AS
(SELECT 1 as SomeInt)
INSERT (SomeInt) INTO TestCTE
SELECT SomeInt FROM CTE;