Masalahnya disebabkan oleh fakta bahwa ternyata beberapa entri memiliki banyak penulis. Jadi gabungan bagian dalam dalam kueri pemilihan yang Anda tulis akan mengembalikan beberapa baris untuk entri yang sama dan INSERT ... ON CONFLICT
tidak suka itu. Karena Anda hanya menggunakan ReferenceAuthor
tabel untuk pemfilteran, Anda cukup menulis ulang kueri sehingga tabel tersebut hanya digunakan untuk memfilter entri yang tidak memiliki penulis dengan melakukan exists
pada subquery yang berkorelasi. Begini caranya:
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)
;