PostgreSQL:子选择内部插入
我有一个名为map_tags的表: 以及另一个表小部件,其记录包含映射标签记录的外键引用1到1: 考虑到所有map_许可证都是唯一的,但是没有设置为map_标记上的键的约束,那么如果我有map_许可证和小部件名称,我希望在同一SQL语句中的小部件上执行插入: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
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]