Das Problem wird dadurch verursacht, dass anscheinend einige Einträge mehrere Autoren haben. Der innere Join in der von Ihnen geschriebenen Auswahlabfrage gibt also mehrere Zeilen für denselben Eintrag und INSERT ... ON CONFLICT
zurück mag das nicht. Da Sie nur den ReferenceAuthor
verwenden Tabelle zum Filtern, können Sie einfach die Abfrage so umschreiben, dass sie diese Tabelle verwendet, um nur Einträge zu filtern, die keinen Autor haben, indem Sie einen exists
ausführen auf einer korrelierten Unterabfrage. So geht's:
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)
;