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)
;