Il problema è causato dal fatto che apparentemente alcune voci hanno più autori. Quindi il join interno nella query di selezione che hai scritto restituirà più righe per la stessa voce e INSERT ... ON CONFLICT
non gli piace. Dal momento che usi solo il ReferenceAuthor
tabella per il filtraggio, puoi semplicemente riscrivere la query in modo che utilizzi quella tabella per filtrare solo le voci che non hanno alcun autore eseguendo un exists
su una sottoquery correlata. Ecco come:
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)
;