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

SQL:Pilih catatan di mana SEMUA catatan yang digabungkan memenuhi beberapa kondisi

Dengan asumsi tidak perlu korelasi, gunakan:

SELECT a.*
  FROM A a
 WHERE EXISTS(SELECT NULL
                FROM B b
              HAVING MIN(b.some_val) > a.val)

Jika Anda memang membutuhkan korelasi:

SELECT a.*
  FROM A a
 WHERE EXISTS(SELECT NULL
                FROM B b
               WHERE b.id = a.id
              HAVING MIN(b.some_val) > a.val)

Penjelasan

EXISTS mengevaluasi pada boolean, berdasarkan kecocokan pertama - ini membuatnya lebih cepat daripada mengatakan menggunakan IN, dan -- tidak seperti menggunakan JOIN -- tidak akan menduplikasi baris. Bagian SELECT tidak masalah - Anda dapat mengubahnya menjadi EXISTS SELECT 1/0 ... dan kueri akan tetap berfungsi meskipun ada kesalahan pembagian dengan nol yang jelas.

Subquery dalam EXISTS menggunakan fungsi agregat MIN untuk mendapatkan B.some_val terkecil - jika nilai tersebut lebih besar dari nilai a.val, a.val lebih kecil dari semua nilai b. Satu-satunya kebutuhan untuk WHERE klausa adalah untuk korelasi - fungsi agregat hanya dapat digunakan di HAVING klausa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konversi Nomor Bulan ke Nama Bulan di PostgreSQL

  2. Buat diagram ER di pgAdmin

  3. nilai terlalu panjang untuk variasi karakter tipe (N)

  4. Bagaimana Mod() Bekerja di PostgreSQL

  5. Apa sintaks PostgreSQL yang setara dengan Oracle CONNECT BY ... MULAI DENGAN?