UPDATE
của bạn truy vấn sẽ giống như sau:
UPDATE table2 t2
SET val2 = t1.val1
FROM table1 t1
WHERE t2.table2_id = t1.table2_id
AND t2.val2 IS DISTINCT FROM t1.val1; -- optional, see below
Theo cách bạn có, không có liên kết giữa các hàng riêng lẻ của hai bảng. Mọi hàng sẽ được tìm nạp từ table1
cho mọi hàng trong table2
. Điều này không có ý nghĩa gì (một cách tốn kém) và cũng gây ra lỗi cú pháp, vì một biểu thức truy vấn con ở vị trí này chỉ được phép trả về một giá trị duy nhất.
Tôi đã sửa lỗi này bằng cách kết hợp hai bảng trên table2_id
. Thay thế nó bằng bất cứ thứ gì thực sự liên kết cả hai.
Tôi đã viết lại UPDATE
tham gia vào table1
(với FROM
mệnh đề) thay vì chạy các truy vấn con tương quan, bởi vì điều đó thường nhanh hơn theo thứ tự độ lớn.
Nó cũng ngăn table2.val2
đó sẽ bị vô hiệu hóa khi không tìm thấy hàng phù hợp nào trong table1
. Thay vào đó, không có gì xảy ra với các hàng như vậy với dạng truy vấn này.
Bạn có thể thêm biểu thức bảng vào FROM
danh sách giống như trong một SELECT
đơn giản (bảng, truy vấn con, hàm set-return, ...). Hướng dẫn sử dụng:
from_list
Danh sách các biểu thức bảng, cho phép các cột từ các bảng khác xuất hiện trong
WHERE
điều kiện và các biểu thức cập nhật. Điều này tương tự như danh sách các bảng có thể được chỉ định trongFROM
Mệnh đề của mộtSELECT
tuyên bố. Lưu ý rằng bảng đích không được xuất hiện trongfrom_list
, trừ khi bạn có ý định tự tham gia (trong trường hợp đó, nó phải xuất hiện với bí danh trongfrom_list
).
WHERE
cuối cùng mệnh đề ngăn chặn các cập nhật sẽ không thay đổi bất cứ điều gì - thực tế luôn là một ý tưởng hay (gần như toàn bộ chi phí nhưng không có lợi, áp dụng các ngoại lệ kỳ lạ). Nếu cả giá trị cũ và mới đều được đảm bảo là NOT NULL
, đơn giản hóa thành:
AND t2.val2 <> t1.val1
- Làm cách nào để (hoặc tôi có thể) CHỌN DISTINCT trên nhiều cột?