PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cập nhật một cột của một bảng với một cột của một bảng khác trong PostgreSQL

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 trong FROM Mệnh đề của một SELECT tuyên bố. Lưu ý rằng bảng đích không được xuất hiện trong from_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 trong from_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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách ánh xạ trường mảng PostgreSQL trong Django ORM

  2. Truy vấn với LEFT JOIN không trả về các hàng có số lượng là 0

  3. dplyr left_join nhỏ hơn, lớn hơn điều kiện

  4. Mẹo triển khai PostgreSQL trên nền tảng đám mây kết hợp

  5. PostgreSQL:chạy số hàng cho một truy vấn 'theo phút'