Problém je způsoben tím, že zřejmě některé záznamy mají více autorů. Takže vnitřní spojení ve výběrovém dotazu, který jste napsali, vrátí více řádků pro stejnou položku a INSERT ... ON CONFLICT
to nemá rád. Protože používáte pouze ReferenceAuthor
tabulku pro filtrování, můžete jednoduše přepsat dotaz tak, aby používal tuto tabulku pouze k filtrování položek, které nemají žádného autora, a to provedením exists
na korelovaný poddotaz. Zde je postup:
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)
;