Ако приемем, че няма нужда от корелация, използвайте:
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
клауза.