Giả sử không cần tương quan, hãy sử dụng:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
HAVING MIN(b.some_val) > a.val)
Nếu bạn cần sự tương quan:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
WHERE b.id = a.id
HAVING MIN(b.some_val) > a.val)
Giải thích
EXISTS
đánh giá trên boolean, dựa trên so khớp đầu tiên - điều này làm cho nó nhanh hơn so với sử dụng IN và - không giống như sử dụng JOIN - sẽ không trùng lặp các hàng. Phần CHỌN không quan trọng - bạn có thể thay đổi nó thành EXISTS SELECT 1/0 ...
và truy vấn sẽ vẫn hoạt động mặc dù có lỗi phân chia rõ ràng bằng 0.
Truy vấn con trong EXISTS
sử dụng hàm tổng hợp MIN để nhận B.some_val nhỏ nhất - nếu giá trị đó lớn hơn giá trị a.val, thì a.val nhỏ hơn tất cả các giá trị b. Chỉ cần một WHERE
mệnh đề tương quan - chỉ có thể sử dụng các hàm tổng hợp trong HAVING
mệnh đề.