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

Tổng hợp các hàm trên nhiều bảng đã kết hợp

SELECT f.id, f.name, b.fb_ct, t.tag_names
FROM   foo f
LEFT JOIN  (
    SELECT foo_id AS id, count(*) AS fb_ct
    FROM   foo_bar
    GROUP  BY 1
    ) b USING (id)
LEFT JOIN  (
    SELECT target_id AS id, array_agg(name) AS tag_names
    FROM   tag
    GROUP  BY 1
    ) t USING (id)
ORDER  BY f.id;

Tạo ra kết quả mong muốn.

  • Viết lại bằng JOIN rõ ràng cú pháp. Giúp cho việc đọc và hiểu (và gỡ lỗi) trở nên dễ dàng hơn rất nhiều.

  • Bằng cách kết hợp với nhiều 1:n các bảng, các hàng có liên quan sẽ nhân nhau tạo ra sản phẩm Descartes - đó là điều vô nghĩa rất tốn kém. Đây là một CROSS JOIN ngoài ý muốn bằng proxy. Có liên quan:

  • Để tránh điều này, hãy tham gia nhiều nhất một n -chuyển tới 1 -bảng trước khi bạn tổng hợp (GROUP BY ). Bạn có thể tổng hợp hai lần, nhưng tổng hợp n sẽ nhanh hơn và nhanh hơn -bảng riêng trước kết hợp họ với 1 -bàn.

  • Trái ngược với bản gốc của bạn (với INNER JOIN ngầm hiểu ). Tôi sử dụng LEFT JOIN để tránh mất các hàng từ foo không có hàng phù hợp trong foo_bar hoặc thẻ tag .

  • Sau khi CROSS JOIN không mong muốn được xóa khỏi truy vấn, không cần thêm DISTINCT nữa - giả sử rằng foo.id là duy nhấ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. thay đổi cơ sở dữ liệu (postgresql) trong python bằng cách sử dụng psycopg2 động

  2. Ghi nhật ký các truy vấn chậm trên phiên bản Google Cloud SQL PostgreSQL

  3. Xuất dữ liệu lớn từ PostgreSQL sang AWS s3

  4. Không thể khởi động PostgreSQL

  5. Postgresql, truy xuất giá trị cho khóa cụ thể từ mảng json