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

Hai SQL LEFT JOINS tạo ra kết quả không chính xác

Các phép nối được xử lý từ trái sang phải (trừ khi dấu ngoặc đơn quy định khác). Nếu bạn LEFT JOIN (hoặc chỉ JOIN , hiệu ứng tương tự) ba cửa hàng tạp hóa cho một người dùng, bạn nhận được 3 hàng ( 1 x 3 ). Sau đó, nếu bạn tham gia 4 chợ cá cho cùng một người dùng, bạn nhận được 12 ( 3 x 4 ) hàng, nhân số đếm trước đó trong kết quả, không phải thêm nó, giống như bạn có thể đã hy vọng.
Qua đó nhân lên số lượt ghé thăm cửa hàng tạp hóa và chợ cá.

Bạn có thể làm cho nó hoạt động như sau:

SELECT u.id
     , u.account_balance
     , g.grocery_visits
     , f.fishmarket_visits
FROM   users u
LEFT   JOIN (
   SELECT user_id, count(*) AS grocery_visits
   FROM   grocery
   GROUP  BY user_id
   ) g ON g.user_id = u.id
LEFT   JOIN (
   SELECT user_id, count(*) AS fishmarket_visits
   FROM   fishmarket
   GROUP  BY user_id
   ) f ON f.user_id = u.id
ORDER  BY u.id;

Để nhận các giá trị tổng hợp cho một hoặc một vài người dùng, truy vấn con tương quan như @Vince được cung cấp là tốt. Đối với toàn bộ bảng hoặc các phần chính của nó, sẽ hiệu quả hơn (nhiều) nếu tổng hợp n-bảng và kết hợp với kết quả một lần . Bằng cách này, chúng tôi cũng không cần GROUP BY khác trong truy vấn bên ngoài.

grocery_visitsfishmarket_visits NULL cho người dùng không có bất kỳ mục nhập liên quan nào trong các bảng tương ứng. Nếu bạn cần 0 thay vào đó (hoặc bất kỳ số tùy ý nào), hãy sử dụng COALESCE trong SELECT bên ngoài :

SELECT u.id
     , u.account_balance
     , COALESCE(g.grocery_visits   , 0) AS grocery_visits
     , COALESCE(f.fishmarket_visits, 0) AS fishmarket_visits
FROM   ...


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tham số cấu hình work_mem trong PostgreSQL trên Linux

  2. PostgreSQL:Chọn dữ liệu có tương tự trên trường dấu thời gian

  3. PGEast, Đo điểm chuẩn phần cứng và Trang trại hiệu suất PG

  4. SQLAlchemy - SQLite để thử nghiệm và Postgresql để phát triển - Làm thế nào để chuyển?

  5. Các cách truy cập Cơ sở dữ liệu Oracle trong PostgreSQL