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

Lỗi Postgres:Nhiều hơn một hàng được trả về bởi một truy vấn con được sử dụng làm biểu thức

Về mặt kỹ thuật , để sửa chữa bảng sao kê của mình, bạn có thể thêm LIMIT 1 vào truy vấn con để đảm bảo rằng nhiều nhất 1 hàng được trả về. Điều đó sẽ loại bỏ lỗi, mã của bạn sẽ vẫn vô nghĩa.

... 'SELECT store_key FROM store LIMIT 1' ...

Thực tế , bạn muốn so khớp các hàng bằng cách nào đó thay vì chọn một hàng tùy ý từ bảng từ xa store để cập nhật mọi hàng trong bảng cục bộ của bạn customer .
Câu hỏi thô sơ của bạn không cung cấp đủ chi tiết, vì vậy tôi giả sử một cột văn bản match_name trong cả hai bảng (và UNIQUE trong store ) vì lợi ích của ví dụ này:

... 'SELECT store_key FROM store
     WHERE match_name = ' || quote_literal(customer.match_name)  ...

Nhưng đó là một cách làm cực kỳ tốn kém.

Lý tưởng nhất , bạn viết lại hoàn toàn câu lệnh.

UPDATE customer c
SET    customer_id = s.store_key
FROM   dblink('port=5432, dbname=SERVER1 user=postgres password=309245'
            , 'SELECT match_name, store_key FROM store')
       AS s(match_name text, store_key integer)
WHERE c.match_name = s.match_name
AND   c.customer_id IS DISTINCT FROM s.store_key;

Điều này khắc phục một số vấn đề trong bản sao kê ban đầu của bạn.

Rõ ràng, vấn đề cơ bản dẫn đến lỗi của bạn đã được sửa.

Thường tốt hơn nếu tham gia vào các quan hệ bổ sung trong FROM mệnh đề của một UPDATE tuyên bố hơn là chạy truy vấn con tương quan cho mọi hàng riêng lẻ.

Khi sử dụng dblink, những điều trên trở nên quan trọng hơn gấp ngàn lần. Bạn không muốn gọi dblink() đối với mỗi hàng đơn lẻ, giá đó cực kỳ đắt . Gọi nó một lần để truy xuất tất cả các hàng bạn cần.

Với các truy vấn con có liên quan, nếu không tìm thấy hàng nào trong truy vấn con, cột được cập nhật thành NULL, hầu như luôn luôn không phải là những gì bạn muốn. Trong truy vấn cập nhật của tôi, hàng chỉ được cập nhật nếu tìm thấy hàng phù hợp. Khác, hàng không được chạm vào.

Thông thường, bạn sẽ không muốn cập nhật các hàng khi không có gì thực sự thay đổi. Điều đó tốn kém không làm gì cả (nhưng vẫn tạo ra các hàng chết). Biểu thức cuối cùng trong WHERE mệnh đề ngăn cập nhật trống như vậy :

     AND   c.customer_id IS DISTINCT FROM sub.store_key

Có liên quan:

  • 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. PostgreSQL:xuất dữ liệu kết quả từ truy vấn SQL sang Excel / CSV

  2. Chức năng tạo PostgreSQL

  3. PostgreSQL có thể lập chỉ mục các cột mảng không?

  4. GROUP hoặc DISTINCT sau khi JOIN trả về các bản sao

  5. Hiệu suất của chuỗi và chuỗi trong Postgres-XL