Problemet orsakas av det faktum att vissa poster tydligen har flera författare. Så den inre kopplingen i urvalsfrågan som du skrev kommer att returnera flera rader för samma post och INSERT ... ON CONFLICT
gillar inte det. Eftersom du bara använder ReferenceAuthor
tabell för filtrering kan du helt enkelt skriva om frågan så att den använder den tabellen för att bara filtrera poster som inte har någon författare genom att göra en exists
på en korrelerad delfråga. Så här gör du:
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)
;