Использование предложения WITH с оператором INSERT в POSTGRESQL

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

Пример:

Если cust_id='11', то мне нужно получить cust_code из таблицы cust (скажем, он возвращает cust_code='ABCD'), а затем использовать этот cust_code с некоторыми другими данными для вставки в table_1 следующим образом:

WITH get_cust_code_for_cust_id AS (
    SELECT cust_code FROM cust WHERE cust_id=11
)

INSERT INTO public.table_1(
    cust_code, issue, status, created_on)
    VALUES (SELECT cust_code FROM get_cust_code_for_cust_id, 'New Issue', 'Open', current_timestamp)

Но этот запрос не работает, так как мы не вызвали запрос get_cust_code_for_cust_id.

Я предпочитаю некоторый запрос с предложением WITH, но любой другой ответ также будет оценен.


person Neeraj Wadhwa    schedule 16.05.2018    source источник


Ответы (1)


Если источником оператора insert является оператор select, не используйте ключевое слово VALUES.

WITH get_cust_code_for_cust_id AS (
    SELECT cust_code 
    FROM cust 
    WHERE cust_id=11
)
INSERT INTO public.table_1 (cust_code, issue, status, created_on)
SELECT cust_code, 'New Issue', 'Open', current_timestamp 
FROM get_cust_code_for_cust_id;

Однако для этого вам не нужен CTE:

INSERT INTO public.table_1 (cust_code, issue, status, created_on)
SELECT cust_code, 'New Issue', 'Open', current_timestamp  
FROM cust 
WHERE cust_id=11
person a_horse_with_no_name    schedule 16.05.2018
comment
Я хотел бы добавить ссылку на документы и особенно намекнуть на примеры внизу: postgresql.org/docs/current/static/sql-insert.html - person moooeeeep; 16.05.2018
comment
Оба запроса отлично работают для моего сценария. - person Neeraj Wadhwa; 16.05.2018