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 ...