Redshift从CTE INSERT INTO TABLE

fez*_*fez 15 sql common-table-expression amazon-web-services amazon-redshift

根据Redshift WITH Clause 文档,您可以将WITH子句与INSERT INTO...SELECT语句一起使用.但是在测试时,我收到以下错误.这是不可能的,还是我的语法错了?

CREATE TABLE TestCTEInsert (SomeTimestamp TIMESTAMP);
WITH CTE AS
(SELECT GETDATE() as SomeTimestamp)
INSERT INTO TestCTEInsert
    (SomeTimestamp) SELECT SomeTimestamp from CTE;
Run Code Online (Sandbox Code Playgroud)

错误:42601:"插入"或附近的语法错误

有趣的是,它确实支持插入新表,即

WITH CTE AS
(SELECT GETDATE() as SomeTimestamp)
INSERT SomeTimestamp INTO NewTable 
SELECT SomeTimestamp from CTE;
Run Code Online (Sandbox Code Playgroud)

命令成功完成(受影响的1行)

编辑:只是为了确认,我在使用INTEGER列而不是TIMESTAMP:时得到相同的错误:

CREATE TABLE TestCTE (SomeInt INTEGER);
WITH CTE AS
(SELECT 1 as SomeInt)
INSERT INTO TestCTEInsert 
SELECT SomeInt from CTE;
Run Code Online (Sandbox Code Playgroud)

错误:42601:"插入"或附近的语法错误

Ade*_*ite 24

尝试将CTE放入插入物中(不确定是否超过了点)

INSERT INTO TestCTEInsert
WITH CTE AS
(SELECT CURRENT_TIMESTAMP as SomeTimestamp)
SELECT SomeTimestamp from CTE;
Run Code Online (Sandbox Code Playgroud)


a_h*_*ame 7

; 终止的声明,所以它需要去的说法,中间不显山露水的结尾:

您可以通过两种方式执行此操作,使用a create table as select

create table TestCTEInsert 
as
WITH CTE AS
(  
   SELECT current_timestamp as SomeTimestamp
)
SELECT SomeTimestamp 
from CTE; -- ; only at the end
Run Code Online (Sandbox Code Playgroud)

或者分两步:

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
Run Code Online (Sandbox Code Playgroud)

以上是在一个vanilla Postgres安装上运行的,我无法访问RDS