Предполагая, что корреляция не требуется, используйте:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
HAVING MIN(b.some_val) > a.val)
Если вам нужна корреляция:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
WHERE b.id = a.id
HAVING MIN(b.some_val) > a.val)
Объяснение
EXISTS
оценивается как логическое значениена основе первого совпадения - это делает это быстрее, чем, скажем, использование IN, и - в отличие от использования JOIN - не будет дублировать строки.Часть SELECT не имеет значения - вы можете изменить ее на EXISTS SELECT 1/0 ...
, и запрос все равно будет работать, хотя есть очевидное деление на ноль ошибок.
Подзапрос в EXISTS
использует агрегатную функцию MIN дляполучить наименьшее значение B.some_val - если это значение больше значения a.val, значение a.val меньше всех значений b.Единственное требование для условия WHERE
- это корреляция - агрегатные функции могут использоваться только в предложении HAVING
.