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

PostgreSQL di mana semua dalam array

Dengan asumsi tabel gabungan mengikuti praktik yang baik dan memiliki kunci majemuk unik yang ditentukan, yaitu batasan untuk mencegah baris duplikat, maka sesuatu seperti kueri sederhana berikut harus dilakukan.

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

Penting untuk dicatat bahwa angka 2 di akhir adalah panjang daftar user_ids. Itu jelas perlu diubah jika daftar user_id berubah panjang. Jika Anda tidak dapat menganggap tabel gabungan Anda tidak berisi duplikat, ubah "count(*)" menjadi "count(distinct user_id)" dengan beberapa kemungkinan biaya dalam kinerja.

Kueri ini menemukan semua percakapan yang menyertakan semua pengguna tertentu meskipun percakapan juga mencakup pengguna tambahan.

Jika Anda hanya ingin percakapan dengan tepat set pengguna yang ditentukan, salah satu pendekatannya adalah menggunakan subquery bersarang di klausa where seperti di bawah ini. Perhatikan, baris pertama dan terakhir sama dengan kueri asli, hanya dua baris tengah yang baru.

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

Sama halnya, Anda dapat menggunakan operator set perbedaan jika database Anda mendukungnya. Berikut adalah contoh dalam sintaks Oracle. (Untuk Postgres atau DB2, ubah kata kunci "minus" menjadi "kecuali.)

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)

Pengoptimal kueri yang baik harus perlakukan dua variasi terakhir secara identik, tetapi periksa dengan basis data khusus Anda untuk memastikannya. Misalnya, paket kueri Oracle 11GR2 mengurutkan dua set id percakapan sebelum menerapkan operator minus, tetapi melewatkan langkah pengurutan untuk kueri terakhir. Jadi, salah satu paket kueri bisa lebih cepat bergantung pada beberapa faktor seperti jumlah baris, inti, cache, indeks, dll.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemesanan kueri lambat menurut kolom dalam tabel yang digabungkan

  2. ST_DWithin mengambil parameter sebagai derajat , bukan meter , mengapa?

  3. Mengisi kolom Many2many (odoo 8)

  4. Dukungan SQLAlchemy dari Skema Postgres

  5. Adaptor Postgresql (hal):tidak dapat terhubung ke server