PostgreSQL: внутренняя вставка подвыборки

У меня есть таблица под названием map_tags:

map_id | map_license | map_desc

И еще одна таблица (widgets), записи которой содержат ссылку на внешний ключ (от 1 до 1) на запись map_tags:

widget_id | map_id | widget_name

Учитывая ограничение, что все map_license уникальны (однако не настроены как клавиши на map_tags), тогда, если у меня есть map_license и a widget_name, я бы хотел выполнить вставку widgets все внутри одного и того же оператора SQL:

INSERT INTO
    widgets w
(
    map_id,
    widget_name
)
VALUES (
    (
        SELECT
            mt.map_id
        FROM
            map_tags mt
        WHERE
            // This should work and return a single record because map_license is unique
            mt.map_license = '12345'
    ),
    'Bupo'
)

Я считаю, что нахожусь на правильном пути, но знаю сразу, что это неправильный SQL для Postgres. Кто-нибудь знает правильный способ достижения такого единого запроса?

Ответы

Ответ 1

INSERT INTO widgets
(
    map_id,
    widget_name
)
SELECT
    mt.map_id, 'Bupo'
FROM
    map_tags mt
WHERE
    mt.map_license = '12345'

Ответ 2

Используйте вариант INSERT INTO SELECT, включая любые константы, прямо в инструкции SELECT.

Синтаксис PostgreSQL INSERT:

INSERT INTO table [ ( column [, ...] ) ]
 { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
 [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

Обратите внимание на параметр запрос в конце второй строки выше.

Вот вам пример.

INSERT INTO 
    widgets
    (
        map_id,
        widget_name
    )
SELECT 
   mt.map_id,
   'Bupo'
FROM
    map_tags mt
WHERE
    mt.map_license = '12345'