Проблемът се дължи на факта, че очевидно някои записи имат няколко автора. Така че вътрешното присъединяване в заявката за избор, която сте написали, ще върне множество редове за един и същ запис и INSERT ... ON CONFLICT
не харесва това. Тъй като използвате само ReferenceAuthor
таблица за филтриране, можете просто да пренапишете заявката, така че да използва тази таблица само за филтриране на записи, които нямат автор, като направите exists
на корелирана подзаявка. Ето как:
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)
;