【问题标题】:Redshift INSERT INTO TABLE from CTE来自 CTE 的 Redshift INSERT INTO TABLE
【发布时间】:2016-04-23 12:07:14
【问题描述】:

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

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 行)

编辑:确认一下,我在使用INTEGER 列而不是TIMESTAMP 时遇到同样的错误:

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

错误:42601:“插入”处或附近的语法错误

【问题讨论】:

  • 尝试删除插入中的(SomeTimestamp)
  • 感谢您的建议。这将返回相同的错误:ERROR: 42601: syntax error at or near "insert"
  • 据我所知,您不能在时间戳列中插入显式值。
  • 感谢@AksheyBhat,但我认为这不是问题所在。我使用整数列而不是时间戳重新创建了它,并得到了相同的错误消息。
  • ; 位于语句的结尾,而不是中间的某处。

标签: sql amazon-web-services common-table-expression amazon-redshift


【解决方案1】:

尝试将 CTE 放入插件中(不确定这是否胜过重点)

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

【讨论】:

    【解决方案2】:

    把你的脚本改成这个

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

    【讨论】:

    • 这会返回相同的错误。 ERROR: 42601: syntax error at or near "insert"。我用整数列而不是时间戳重新创建了它,并得到了相同的错误消息。
    【解决方案3】:

    试试这个

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

    【讨论】:

      【解决方案4】:

      ; 终止一个语句,所以它需要放在语句的末尾,而不是中间的某个地方:

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

      create table TestCTEInsert 
      as
      WITH CTE AS
      (  
         SELECT current_timestamp as SomeTimestamp
      )
      SELECT SomeTimestamp 
      from CTE; -- ; only at the end
      

      或者分两步:

      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
      

      以上运行在普通 Postgres 安装上,我无权访问 RDS

      【讨论】:

      • 感谢您的帮助@a_horse_with_no_name。我脚本中的分号只是为了分隔 CREATE TABLE 和 CTE 插入,所以我可以分两步执行此操作(如上面的第二个查询)。我已经接受了 Adeeb 的回答,因为他的回答要快一些。
      猜你喜欢
      • 2018-11-06
      • 2010-10-26
      • 2011-05-13
      • 2023-02-09
      • 2011-03-19
      • 1970-01-01
      • 2015-04-12
      • 2014-05-12
      • 2023-03-18
      相关资源
      最近更新 更多