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.