Het probleem wordt veroorzaakt door het feit dat sommige inzendingen blijkbaar meerdere auteurs hebben. Dus de inner join in de select-query die je hebt geschreven, retourneert meerdere rijen voor hetzelfde item en INSERT ... ON CONFLICT
houdt daar niet van. Aangezien u alleen de ReferenceAuthor
. gebruikt tabel om te filteren, kunt u de query eenvoudig herschrijven zodat deze die tabel gebruikt om alleen items te filteren die geen auteur hebben door een exists
uit te voeren op een gecorreleerde subquery. Hier is hoe:
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)
;