2016-11-29 5 views
0

Я намерен написать запрос INSERT INTO в Postgresql на основе нескольких SELECT, но не удалось. У меня есть одна таблица, содержащая данные, которые я выбираю (srctab), и еще один, где я вставляю данные (dsttab). Вот что я бегу:Postgresql - INSERT INTO на основе нескольких SELECT

INSERT INTO dsttab (dstfld1, dstfld2) WITH 
    t1 AS (
    SELECT srcfld1 
    FROM srctab 
    WHERE srcfld3 ='foo' 
), 
    t2 AS (
    SELECT srcfld5 
    FROM srctab 
    WHERE srcfld6 ='bar' 
) select srcfld1, srcfld5 from srctab; 

Не могли бы вы помочь сделать эту работу? Спасибо !

+3

«Вставить» нужно идти после 'с' - но все это не имеет смысла. Вы определяете два CTE, но никогда не используете их. Что именно ты пытаешься сделать? –

ответ

1

Примечание: Я предполагаю, что вы хотите здесь сделать. Я предполагаю, что вы хотите вставить одну строку со значениями из CTE (это блок WITH.). Ваш запрос, как написано, вставляет строку в dsttab для каждую строку в srctab, если бы это был синтаксис.


Вам здесь не нужен CTE. CTE действительно должны использоваться только тогда, когда вам нужно ссылаться на один и тот же подзапрос более одного раза; для чего они существуют. (Иногда, вы можете несколько злоупотреблять им контролировать некоторые аспекты производительности в PostgreSQL, но это не так в других БД и что-то следует избегать, если это возможно в любом случае.)

Просто поместите ваши запросы в строке:

INSERT INTO dsttab (dstfld1, dstfld2) 
VALUES (
    (SELECT srcfld1 
    FROM srctab 
    WHERE srcfld3 ='foo'), 
    (SELECT srcfld5 
    FROM srctab 
    WHERE srcfld6 ='bar') 
); 

Ключевым моментом здесь является окружение подзапросов круглыми скобками.

+0

Ваша интерпретация имеет больше смысла, хотя нисходящая линия не была оценена. –

Смежные вопросы