Vấn đề là do thực tế là rõ ràng một số mục có nhiều tác giả. Vì vậy, phép nối bên trong trong truy vấn chọn mà bạn đã viết sẽ trả về nhiều hàng cho cùng một mục nhập và INSERT ... ON CONFLICT
không thích điều đó. Vì bạn chỉ sử dụng ReferenceAuthor
để lọc, bạn có thể chỉ cần viết lại truy vấn để nó sử dụng bảng đó để chỉ lọc các mục nhập không có bất kỳ tác giả nào bằng cách thực hiện exists
trên một truy vấn con tương quan. Đây là cách thực hiện:
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)
;