使用单个 SQL 语句而不是循环插入到 2 个表中

Insert into 2 tables with single SQL statement instead of loop

我必须在几个 table 的来源中插入数据,这些数据本身来自 csv (COPY)。

之前我在函数中使用了一个LOOP来输入数据。为了可维护性和速度,我想简化它。

我需要将数据插入到描述 table 中,它同时用作标题和描述(以及多语言)。

以前我的代码如下(从循环中提取):

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' table 中插入 'poi_id',而 table 对应于描述 table 中插入的 table。

我收到此错误消息:

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;

相关:

  • PostgreSQL multi INSERT...RETURNING with multiple columns
  • Insert data in 3 tables at a time using Postgres