web-dev-qa-db-ja.com

CTEからのRedshiftINSERT INTO TABLE

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:「挿入」またはその近くの構文エラー

15
fez

CTEをインサートに入れてみてください(それがポイントを上回っているかどうかはわかりません)

INSERT INTO TestCTEInsert
WITH CTE AS
(SELECT CURRENT_TIMESTAMP as SomeTimestamp)
SELECT SomeTimestamp from CTE;
24
Adeeb Armalite

;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;
1

これを試して

 CREATE TABLE TestCTE (SomeInt INTEGER)
;WITH CTE AS
(SELECT 1 as SomeInt)
INSERT (SomeInt) INTO TestCTE
SELECT SomeInt FROM CTE;
1
Hiten004