sql - 使用单个 SQL 语句而不是循环插入 2 个表
问题描述
我必须在几个表的来源中插入数据,这些表本身来自 csv (COPY)。
在我使用一个LOOP
函数输入数据之前。为了可维护性和速度,我想简化事情。
我需要将数据插入到描述表中,该表同时用作标题和描述(以及多语言)。
以前我的代码如下(从循环中提取):
insert into description (label, lang_id, poi_id,date_dernier_update, date_enregistrementbdd, date_derniere_lecture) values (label, lang_id, poi_id, now(), now(), now()) RETURNING id INTO _retour_id_titre;
insert into poi_titre_poi (poi_id, titre_poi_id, titre_poi_key) values (poi_id, _retour_id_titre, label_lang);
但现在我不能:
with rows as (
insert into description (label, lang_id, poi_id)
select rdfslabelfrs, '1', (select id from poi where uri_id = csv_poi_rdf_fr.poi) as toto from csv_poi_rdf_fr RETURNING id
)
insert into poi_titre_poi (poi_id, titre_poi_id, titre_poi_key)
select description.poi_id, id , 'fr'
FROM description;
事实上,我无法在“poi_titre_poi”表中插入“poi_id”,该表对应于在描述表中插入的表。
我收到此错误消息:
ERROR: more than one row returned by a subquery used as an expression État SQL : 21000
我可以完成这项工作,还是需要循环?
解决方案
用假设填充缺失的位,它可以像这样工作:
WITH description_insert AS (
INSERT INTO description
(label , lang_id, poi_id)
SELECT c.rdfslabelfrs, 1 , p.id
FROM csv_poi_rdf_fr c
JOIN poi p ON p.uri_id = c.poi
RETURNING poi_id, id
)
INSERT INTO poi_titre_poi (poi_id, titre_poi_id, titre_poi_key)
SELECT d.poi_id, d.id , 'fr'
FROM description_insert d;
有关的: