如何在insert中包含select语句的值?(PostgreSQL)
我有这样一句话:如何在insert中包含select语句的值?(PostgreSQL),postgresql,Postgresql,我有这样一句话: select it.item_id from item as it where it.owning_collection in (select col.collection_id from collection as col where col.name like '%Restricted%' 返回3k左右的结果。现在,我想在另一个表中插入这些结果中的每一个,并将该项_id作为如下参数之一: insert into metadatavalue (metadata_value_
select it.item_id
from item as it
where it.owning_collection in (select col.collection_id
from collection as col
where col.name like '%Restricted%'
返回3k左右的结果。现在,我想在另一个表中插入这些结果中的每一个,并将该项_id作为如下参数之一:
insert into metadatavalue (metadata_value_id, **item_id**, metadata_field_id, text_value, text_lang, place, confidence)
但由于我对数据库不是很有经验,我不知道如何进行这些多次插入
insert语句中需要的所有其他信息都是固定值
表结构:
Table Item
*item_id
*submitter_id
*in_archive
*withdrawn
*last_modified
*owning_collection
*dicoverable
Table metadata
*metadata_value_id
*item_id
*metadata_field_id
*text_value
*text_lang
*place
*authority
*confidence
将“撇号”列替换为其默认值
.插入元数据值(项目id、元数据字段id、文本值、文本语言、位置、置信度)
选择它。项目\u id,
从项目本身开始
在col.collection\u id=it.owning\u collection上以col的形式加入集合
其中列名为“%Restricted%”
用常量值替换
等。另外请注意,我已将您的选择
查询重写为更有效的联接
如何获得其他列?其他列没有问题,它们将是固定值。您的意思是项id
是表元数据值
中的列名吗?或者在INSERT
语句中是否缺少VALUES
或SELECT
子句?是的,这就是我从SELECT语句中获取的数据。我只是没有包括语句中的值部分,因为我不确定它是否应该这样解决。如果item_id
是一个列名,那么从哪里获得要插入的值?非常感谢!它就像一个符咒!我只是做了一些小的调整。语句末尾缺少一个括号,我删除了元数据\u value\u id,因为这是一个自动增量值。非常感谢!我现在知道如何对从查询中获得的值进行多次插入!下次我会尝试这种优化!你真的帮了大忙,欢迎你!查看SELECT
documentation页面上的JOIN
子句,它通常比WHERE somecolumn IN(子查询)
上的过滤器快得多。
insert into metadatavalue (metadata_value_id, item_id, metadata_field_id, text_value, text_lang, place, confidence)
select 'metadata_value_id',it.item_id,'metadata_field_id','text_value', 'text_lang', 'place', 'confidence'
from item it
where it.owning_collection in (select col.collection_id
from collection as col
where col.name like '%Restricted%')
INSERT INTO metadatavalue (item_id, metadata_field_id, text_value, text_lang, place, confidence)
SELECT it.item_id, <c1>, <c2>, <c3>, <c4>, <c5>
FROM item AS it
JOIN collection AS col ON col.collection_id = it.owning_collection
WHERE col.name LIKE '%Restricted%'