PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Memilih subset yang cocok dalam relasi banyak-ke-banyak

Select project_ID 
from user_projects
where user_ID in (1,2)
group by project_ID
Having count(*) = 2

Anda tahu bahwa Anda memiliki 2 pengguna, Anda tahu bahwa mereka akan unik (kunci utama) sehingga Anda tahu bahwa jika ada 2 catatan, untuk proyek yang sama maka itu yang Anda inginkan.

Pertanyaan Anda menunjukkan bahwa Anda memiliki GIVEN yang dikirim dari pengguna sehingga Anda tahu pengguna apa dan berapa jumlahnya. SQL di atas dapat diperbarui untuk menerima parameter yang diketahui ini dan dengan demikian tetap dinamis, tidak terbatas hanya pada 2 pengguna.

where user_ID in (userlist)
having count(*) = (cntuserList)

-----------Untuk menangani situasi ketika set pengguna kosong------P>

Select P.project_ID 
from Projects P
LEFT JOIN user_projects UP
where (UP.user_ID in (1,2) OR UP.USER_ID is null)
group by project_ID
Having count(*) = 2

Jadi inilah yang dilakukannya. Ini mengembalikan semua proyek dan jika ada pengguna yang berafiliasi dengan proyek itu, itu mengidentifikasi mereka. Jika Anda menetapkan berisi pengguna, daftar proyek yang dikembalikan difilter oleh set itu memastikan bahwa seluruh set ada di proyek melalui klausa memiliki.

Jika set kosong, LEFT join bersama dengan userID is null pernyataan akan membuat proyek tanpa pengguna terdaftar terlepas dari apakah set kosong atau tidak. Klausa memiliki selanjutnya akan mengurangi set ke # pengguna yang Anda tetapkan di set, ATAU 0 menunjukkan kembalikan semua proyek tanpa pengguna yang ditetapkan.

Satu kasus tepi tambahan yang belum kami diskusikan adalah apa yang akan terjadi jika sebuah proyek berisi lebih banyak pengguna daripada yang Anda tetapkan di set. Saat ini proyek ini akan dikembalikan; tapi saya tidak yakin itu yang Anda inginkan.

di samping catatan terima kasih untuk membuat saya berpikir. Saya tidak bisa masuk ke dalam kode sebanyak itu lagi; itulah sebabnya saya sering bermain-main di sini untuk melihat apakah saya dapat membantu!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengimpor CSV dengan koma dalam nilai string

  2. Bagaimana cara menulis kueri sql parameter untuk mencegah injeksi SQL?

  3. Bagaimana cara mensimulasikan kebuntuan di PostgreSQL?

  4. Bagaimana saya bisa memberi tahu PostgreSQL untuk tidak membatalkan seluruh transaksi ketika satu kendala gagal?

  5. Sekuel Migrasi - Buat Pemicu di PostgreSQL