PostgreSQL:子选择内部插入

PostgreSQL:子选择内部插入,sql,postgresql,insert,subquery,Sql,Postgresql,Insert,Subquery,我有一个名为map_tags的表: 以及另一个表小部件,其记录包含映射标签记录的外键引用1到1: 考虑到所有map_许可证都是唯一的,但是没有设置为map_标记上的键的约束,那么如果我有map_许可证和小部件名称,我希望在同一SQL语句中的小部件上执行插入: INSERT INTO widgets w ( map_id, widget_name ) VALUES ( ( SELECT mt.map_id FR

我有一个名为map_tags的表:

以及另一个表小部件,其记录包含映射标签记录的外键引用1到1:

考虑到所有map_许可证都是唯一的,但是没有设置为map_标记上的键的约束,那么如果我有map_许可证和小部件名称,我希望在同一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'
)
我相信我的思路是正确的,但我一开始就知道这对于Postgres是不正确的SQL。有人知道实现这种单一查询的正确方法吗?

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

PostgreSQL插入语法为:

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'
快速回答: 你没有一条记录你有一套记录 如果这是javascript:您有一个1值而不是1值的数组

在您的示例中,子查询中可能会返回一条记录, 但您仍在尝试将一组记录解压到单独的文件中 将实际参数放入仅使用1个参数的位置

我花了几个小时才明白为什么不。 当我试图做一些非常相似的事情时:

以下是我的笔记:

tb_table01: (no records)
+---+---+---+
| a | b | c | << column names
+---+---+---+

tb_table02:
+---+---+---+
| a | b | c | << column names
+---+---+---+
|'d'|'d'|'d'| << record #1
+---+---+---+
|'e'|'e'|'e'| << record #2
+---+---+---+
|'f'|'f'|'f'| << record #3
+---+---+---+

--This statement will fail:
INSERT into tb_table01
    ( a, b, c )
VALUES
    (  'record_1.a', 'record_1.b', 'record_1.c' ),
    (  'record_2.a', 'record_2.b', 'record_2.c' ),

    -- This sub query has multiple
    -- rows returned. And they are NOT
    -- automatically unpacked like in 
    -- javascript were you can send an
    -- array to a variadic function.
    (
        SELECT a,b,c from tb_table02
    ) 
    ;
回到您的SQL问题:

此功能不存在的现实不会改变 因为您的子选择只包含一个结果。它是
只有一条记录的集合不是一条记录。

从来没有用PostgreSQL做过,但它看起来不应该像是插入小部件选择NULL,map\u id,'Bupo'FROM map\u tags,其中map\u license='12345'?谢谢@raina77ow+1-我不确定它是否应该是这样。SELECT语句代替。。。价值观不过,语法确实让我很反感。你能给我解释一下该怎么做吗?再次感谢!嗯,我只是像在MySQL中一样使用它。。。我想,原因是您必须构建将要插入的整个数据集,而值选择smth,“smth_else”不能做到这一点。实际上,您不需要根据以下语法使用值:将列名称插入表2中,从表1中选择列名称;这是一种非常有用的语法,当您要插入的表有一个串行PK或类似的PK时,为什么另一个几乎相同但不太完整,一分钟后答案被更多地投票接受?因为堆栈交换正在成为一种功能强大得多的工具。所以他们决定让它完全破碎。
INSERT INTO 
    widgets
    (
        map_id,
        widget_name
    )
SELECT 
   mt.map_id,
   'Bupo'
FROM
    map_tags mt
WHERE
    mt.map_license = '12345'
INSERT INTO widgets
(
    map_id,
    widget_name
)
SELECT
    mt.map_id, 'Bupo'
FROM
    map_tags mt
WHERE
    mt.map_license = '12345'
tb_table01: (no records)
+---+---+---+
| a | b | c | << column names
+---+---+---+

tb_table02:
+---+---+---+
| a | b | c | << column names
+---+---+---+
|'d'|'d'|'d'| << record #1
+---+---+---+
|'e'|'e'|'e'| << record #2
+---+---+---+
|'f'|'f'|'f'| << record #3
+---+---+---+

--This statement will fail:
INSERT into tb_table01
    ( a, b, c )
VALUES
    (  'record_1.a', 'record_1.b', 'record_1.c' ),
    (  'record_2.a', 'record_2.b', 'record_2.c' ),

    -- This sub query has multiple
    -- rows returned. And they are NOT
    -- automatically unpacked like in 
    -- javascript were you can send an
    -- array to a variadic function.
    (
        SELECT a,b,c from tb_table02
    ) 
    ;
function takeValues( ...values ){ 
    values.forEach((v)=>{ console.log( v ) });
};

var records = [ [1,2,3],[4,5,6],[7,8,9] ];
takeValues( records );

//:RESULT:
//: console.log #1 : [1,2,3]
//: console.log #2 : [4,5,7]
//: console.log #3 : [7,8,9]