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

PostgreSQL nơi tất cả trong mảng

Giả sử bảng nối tuân theo thông lệ tốt và có một khóa ghép duy nhất được xác định, tức là một ràng buộc để ngăn các hàng trùng lặp, thì điều gì đó giống như truy vấn đơn giản sau đây sẽ thực hiện.

select conversation_id from conversations_users where user_id in (1, 2)
group by conversation_id having count(*) = 2

Điều quan trọng cần lưu ý là số 2 ở cuối là độ dài của danh sách user_ids. Điều đó rõ ràng cần phải thay đổi nếu danh sách user_id thay đổi độ dài. Nếu bạn không thể cho rằng bảng tham gia của mình không chứa các bản trùng lặp, hãy thay đổi "count (*)" thành "count (user_id riêng biệt)" với một số chi phí có thể có trong hiệu suất.

Truy vấn này tìm tất cả các cuộc hội thoại bao gồm tất cả những người dùng được chỉ định ngay cả khi cuộc trò chuyện cũng bao gồm những người dùng bổ sung.

Nếu bạn chỉ muốn các cuộc trò chuyện với chính xác tập hợp người dùng được chỉ định, một cách tiếp cận là sử dụng truy vấn con lồng nhau trong mệnh đề where như bên dưới. Lưu ý, dòng đầu tiên và dòng cuối cùng giống với truy vấn ban đầu, chỉ có hai dòng ở giữa là mới.

select conversation_id from conversations_users where user_id in (1, 2)
   and conversation_id not in
   (select conversation_id from conversations_users where user_id not in (1,2))
group by conversation_id having count(*) = 2

Tương tự, bạn có thể sử dụng toán tử chênh lệch tập hợp nếu cơ sở dữ liệu của bạn hỗ trợ nó. Đây là một ví dụ trong cú pháp Oracle. (Đối với Postgres hoặc DB2, hãy thay đổi từ khóa "trừ" thành "ngoại trừ.)

select conversation_id from conversations_users where user_id in (1, 2)
  group by conversation_id having count(*) = 2
minus
  select conversation_id from conversations_users where user_id not in (1,2)

Trình tối ưu hóa truy vấn tốt nên coi hai biến thể cuối cùng giống hệt nhau, nhưng hãy kiểm tra với cơ sở dữ liệu cụ thể của bạn để chắc chắn. Ví dụ:kế hoạch truy vấn Oracle 11GR2 sắp xếp hai bộ id hội thoại trước khi áp dụng toán tử trừ, nhưng bỏ qua bước sắp xếp cho truy vấn cuối cùng. Vì vậy, một trong hai kế hoạch truy vấn có thể nhanh hơn tùy thuộc vào nhiều yếu tố như số lượng hàng, lõi, bộ nhớ cache, chỉ số, v.v.



  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 cách nào để nhập mô-đun hoặc cài đặt tiện ích mở rộng trong Postgres?

  2. Chủ sở hữu cơ sở dữ liệu postgresql không thể truy cập cơ sở dữ liệu - Không tìm thấy quan hệ nào.

  3. Cách hoạt động của to_timestamp () trong PostgreSQL

  4. Ánh xạ trường điểm hình học PostGIS với Hibernate trên Spring Boot

  5. Định cấu hình PostgreSQL cho sự liên tục trong kinh doanh