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

Đếm số hàng sau khi nối ba bảng trong PostgreSQL

Để đơn giản hóa logic của bạn, hãy tổng hợp trước, kết hợp sau.

Đoán các chi tiết còn thiếu, truy vấn này sẽ cung cấp cho bạn số lượng chính xác, số lần mỗi người dùng được tham chiếu trong table1table2 tương ứng cho tất cả người dùng :

SELECT *
FROM   users u
LEFT   JOIN (
   SELECT updated_by_id AS id, count(*) AS t1_ct
   FROM   table1
   GROUP  BY 1
   ) t1 USING (id)
LEFT   JOIN (
   SELECT updated_by_id AS id, count(*) AS t2_ct
   FROM   table2
   GROUP  BY 1
   ) t2 USING (id);

Đặc biệt, tránh nhiều mối quan hệ 1-n nhân với nhau khi kết hợp với nhau:

Để truy xuất một hoặc một vài người dùng chỉ, LATERAL tham gia sẽ nhanh hơn (Postgres 9.3+):

SELECT *
FROM   users u
LEFT   JOIN  LATERAL (
   SELECT count(*) AS t1_ct
   FROM   table1
   WHERE  updated_by_id = u.id
   ) ON true
LEFT   JOIN  LATERAL (
   SELECT count(*) AS t2_ct
   FROM   table2
   WHERE  updated_by_id = u.id
   ) ON true
WHERE  u.id = 100;

Giải thích sự khác biệt nhận thức được

Sự không khớp cụ thể mà bạn báo cáo là do các chi tiết cụ thể của FULL OUTER JOIN :

Vì vậy, bạn nhận được các giá trị NULL được thêm vào ở phía bên kia tương ứng cho các kết quả khớp bị thiếu. count() không tính giá trị NULL. Vì vậy, bạn có thể nhận được một kết quả khác tùy thuộc vào việc bạn có lọc trên u1.id=100 hay không hoặc u2.id=100 .

Điều này chỉ để giải thích, bạn không cần FULL JOIN nơi đây. Thay vào đó, hãy sử dụng các lựa chọn thay thế được trình bày.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để xác định lại toàn cầu tiếp theo trong PostgreSQL?

  2. Làm cách nào để thực hiện truy vấn tìm kiếm trên giá trị cột chứa một chuỗi có các giá trị được phân tách bằng dấu phẩy?

  3. Cách đặt một số biến ngữ cảnh cho người dùng / kết nối

  4. Làm cách nào để truy vấn tất cả các hàng trong bán kính 5 dặm tính từ tọa độ của tôi?

  5. Spring Batch - Không thể lưu các bản ghi vào cơ sở dữ liệu Postgres