Problem jest spowodowany tym, że podobno niektóre wpisy mają wielu autorów. Tak więc sprzężenie wewnętrzne w napisanym zapytaniu wybierającym zwróci wiele wierszy dla tego samego wpisu i INSERT ... ON CONFLICT
tego nie lubi. Ponieważ używasz tylko ReferenceAuthor
tabeli do filtrowania, możesz po prostu przepisać zapytanie, aby używało tej tabeli tylko do filtrowania wpisów, które nie mają żadnego autora, wykonując exists
na skorelowanym podzapytaniu. Oto jak:
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)
;