Redshift INSERT INTO TABLE из CTE

Согласно пункту Redshift WITH документации, вы можете использовать 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 строка)

EDIT: Просто для подтверждения я получаю ту же ошибку при использовании столбца INTEGER, а не TIMESTAMP:

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

ОШИБКА: 42601: синтаксическая ошибка в строке «вставка» или рядом с ней


person fez    schedule 18.01.2016    source источник
comment
попробуйте удалить (SomeTimestamp) во вставке   -  person sagi    schedule 18.01.2016
comment
Спасибо за ваше предложение. Это возвращает ту же ошибку: ERROR: 42601: syntax error at or near "insert"   -  person fez    schedule 18.01.2016
comment
Насколько я знаю, вы не можете вставить явное значение в столбец метки времени.   -  person Akshey Bhat    schedule 18.01.2016
comment
Спасибо @AksheyBhat, но я не думаю, что это проблема. Я воссоздал это с целым столбцом, а не с отметкой времени, и получил то же сообщение об ошибке.   -  person fez    schedule 18.01.2016
comment
; ставится в конец оператора, а не где-то в середине.   -  person a_horse_with_no_name    schedule 18.01.2016


Ответы (4)


Попробуйте поместить CTE во вставку (не уверен, что это лучше)

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

; завершает оператор, поэтому он должен идти в конце оператора, а не где-то в середине:

Вы можете сделать это двумя способами: либо использовать 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.

person a_horse_with_no_name    schedule 18.01.2016
comment
Спасибо за помощь @a_horse_with_no_name. Точка с запятой в моем сценарии была предназначена только для разделения CREATE TABLE и вставки CTE, чтобы я мог сделать это в два этапа (как ваш второй запрос выше). Я принял ответ Адиба, так как он ответил немного быстрее. - person fez; 18.01.2016

Измените свой скрипт на этот

  CREATE TABLE TestCTE (SomeInt INTEGER)
  WITH CTE AS (SELECT 1 as SomeInt) 
  INSERT INTO TestCTE  SELECT SomeInt from CTE;
person download dowload    schedule 18.01.2016
comment
Это возвращает ту же ошибку. ERROR: 42601: syntax error at or near "insert". Я воссоздал это с целым столбцом, а не с отметкой времени, и получил то же сообщение об ошибке. - person fez; 18.01.2016

Попробуй это

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