Le problème est causé par le fait qu'apparemment certaines entrées ont plusieurs auteurs. Ainsi, la jointure interne dans la requête de sélection que vous avez écrite renverra plusieurs lignes pour la même entrée et INSERT ... ON CONFLICT
n'aime pas ça. Puisque vous n'utilisez que le ReferenceAuthor
table pour le filtrage, vous pouvez simplement réécrire la requête afin qu'elle utilise cette table pour filtrer uniquement les entrées qui n'ont pas d'auteur en faisant un exists
sur une sous-requête corrélée. Voici comment :
INSERT INTO new.bookmonographs (citavi_id, abstract, createdon, edition, title, year)
SELECT "ID", "Abstract", "CreatedOn"::timestamp, "Edition", "Title", "Year"
FROM old."Reference"
WHERE old."Reference"."ReferenceType" = 'Book'
AND old."Reference"."Year" IS NOT NULL
AND old."Reference"."Title" IS NOT NULL
AND exists(SELECT FROM old."ReferenceAuthor" WHERE old."ReferenceAuthor"."ReferenceID" = old."Reference"."ID")
--Year, Title and Author must be present in the data, otherwise the entry is deemed useless, hence won't be included
ON CONFLICT (citavi_id) DO UPDATE
SET (abstract, createdon, edition, title, year) = (excluded.abstract, excluded.createdon, excluded.edition, excluded.title, excluded.year)
;