4

В соответствии с разделом Redshift WITH documentation вы можете использовать предложение WITH с инструкцией INSERT INTO...SELECT. Однако, проверяя это, я получаю следующую ошибку. Разве это невозможно, или у меня синтаксис неправильный?RedShift INSERT INTO TABLE от CTE

CREATE TABLE TestCTEInsert (SomeTimestamp TIMESTAMP); 
WITH CTE AS 
(SELECT GETDATE() as SomeTimestamp) 
INSERT INTO TestCTEInsert 
    (SomeTimestamp) SELECT SomeTimestamp from CTE; 

ERROR: 42601: syntax error at or near "insert"

Интересно, что он делает поддержка вставки в новую таблицу т.е.

WITH CTE AS 
(SELECT GETDATE() as SomeTimestamp) 
INSERT SomeTimestamp INTO NewTable 
SELECT SomeTimestamp from CTE; 

The command completed successfully (1 rows affected)

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

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

ERROR: 42601: syntax error at or near "insert"

+0

попробуйте удалить (SomeTimestamp) в вкладыш – sagi

+0

Спасибо за ваше предложение. Это возвращает ту же ошибку: «ОШИБКА: 42601: синтаксическая ошибка в или рядом с« insert »' – fez

+0

Насколько я знаю, вы не можете вставить явное значение в столбец timestamp. –

ответ

11

Попробуйте положить КТР во вставке (не уверен, если это бьет точку)

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

Изменить сценарий к этому

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

Это возвращает ту же ошибку. 'ОШИБКА: 42601: синтаксическая ошибка в или рядом с" insert ". Я воссоздал это с целым столбцом, а не с меткой времени, и получил то же сообщение об ошибке. – fez

+0

попробуйте этот скрипт сейчас –

+0

Все еще возвращает ту же ошибку. – fez

0

Попробуйте

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

+0

Спасибо за помощь @a_horse_with_no_name. Точка с запятой в моем скрипте должна была просто отделить CREATE TABLE и CTE, чтобы я мог сделать это в два этапа (например, ваш второй запрос выше). Я принял ответ Адибе, поскольку он был немного быстрее с его ответом. – fez