首页 > 解决方案 > 使用单个 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

我可以完成这项工作,还是需要循环?

标签: sqlpostgresqlinsertcommon-table-expression

解决方案


用假设填充缺失的位,它可以像这样工作:

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;

有关的:


推荐阅读