PostgreSQL:在插入内部进行子选择

Ban*_*der 28 sql postgresql insert subquery

我有一张名为map_tags:

map_id | map_license | map_desc
Run Code Online (Sandbox Code Playgroud)

另一个table(widgets),其记录包含对记录的外键引用(1到1)map_tags:

widget_id | map_id | widget_name
Run Code Online (Sandbox Code Playgroud)

鉴于所有map_licenses都是唯一的约束(但是没有设置为键map_tags),那么如果我有a 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'
)
Run Code Online (Sandbox Code Playgroud)

相信我走在正确的轨道上但是马上知道这对于Postgres来说这是不正确的SQL.有没有人知道实现这样一个查询的正确方法?

gah*_*ooa 37

使用INSERT INTO SELECT变量,包括SELECT语句中的任何常量.

PostgreSQL INSERT语法是:

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

记下上面第二行末尾的查询选项.

这是一个例子.

INSERT INTO 
    widgets
    (
        map_id,
        widget_name
    )
SELECT 
   mt.map_id,
   'Bupo'
FROM
    map_tags mt
WHERE
    mt.map_license = '12345'
Run Code Online (Sandbox Code Playgroud)

  • 为什么其他几乎相同但不太完整的问题,以及一分钟后的答案又被更多地投票并被接受了? (2认同)

Clo*_*eto 33

INSERT INTO widgets
(
    map_id,
    widget_name
)
SELECT
    mt.map_id, 'Bupo'
FROM
    map_tags mt
WHERE
    mt.map_license = '12345'
Run Code Online (Sandbox Code Playgroud)