使用单个 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
我必须在几个 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