Bạn cần đặt đúng tên bảng và bí danh của mình. Ngoài ra, kết nối giữa hai bảng là cột image
(data
trong bảng mới file_data
):
WITH inserted AS (
INSERT INTO file_data (data)
SELECT image
FROM task_log
WHERE image IS NOT NULL
RETURNING id, data -- can only reference target row
)
UPDATE task_log t
SET attachment_id = i.id
, attachment_type = 'INLINE_IMAGE'
FROM inserted i
WHERE t.image = i.data;
Giống như đã giải thích trong câu trả lời cũ của tôi mà bạn đã tham khảo, image
phải là duy nhất trong task_log
để điều này hoạt động:
Tôi đã thêm một kỹ thuật làm thế nào để phân biệt các giá trị không phải là duy nhất trong câu trả lời được tham chiếu. Không chắc liệu bạn có muốn các hình ảnh trùng lặp trong file_data
hay không , mặc dù.
Trong RETURNING
mệnh đề của một INSERT
bạn chỉ có thể tham chiếu các cột từ hàng được chèn. Hướng dẫn sử dụng:
Nhấn mạnh đậm của tôi.
Gấp các giá trị nguồn trùng lặp
Nếu bạn muốn các mục nhập riêng biệt trong bảng đích của INSERT
(task_log
), tất cả những gì bạn cần trong trường hợp này là DISTINCT
trong SELECT
ban đầu :
WITH inserted AS (
INSERT INTO file_data (data)
SELECT DISTINCT image -- fold duplicates
FROM task_log
WHERE image IS NOT NULL
RETURNING id, data -- can only reference target row
)
UPDATE task_log t
SET attachment_id = i.id
, attachment_type = 'INLINE_IMAGE'
FROM inserted i
WHERE t.image = i.data;
file_data.id
kết quả được sử dụng nhiều lần trong task_log
. Lưu ý rằng nhiều hàng trong task_log
bây giờ trỏ đến cùng một hình ảnh trong file_data
. Cẩn thận với các bản cập nhật và xóa ...