この問題は、明らかに一部のエントリに複数の作成者がいるという事実が原因で発生します。したがって、作成したselectクエリの内部結合は、同じエントリに対して複数の行を返し、INSERT ... ON CONFLICT
それが好きではありません。 ReferenceAuthor
のみを使用するため フィルタリング用のテーブルの場合、クエリを書き直すだけで、そのテーブルを使用して、exists
を実行することにより、作成者がいないエントリのみをフィルタリングできます。 相関サブクエリで。方法は次のとおりです。
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)
;