El problema se debe al hecho de que, aparentemente, algunas entradas tienen varios autores. Entonces, la unión interna en la consulta de selección que escribió devolverá varias filas para la misma entrada y INSERT ... ON CONFLICT
no le gusta eso Dado que solo usa el ReferenceAuthor
para filtrar, simplemente puede reescribir la consulta para que use esa tabla para filtrar solo las entradas que no tienen ningún autor haciendo un exists
en una subconsulta correlacionada. Así es como:
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)
;