Za předpokladu, že není potřeba korelace, použijte:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
HAVING MIN(b.some_val) > a.val)
Pokud potřebujete korelaci:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
WHERE b.id = a.id
HAVING MIN(b.some_val) > a.val)
Vysvětlení
EXISTS
vyhodnocuje na booleanu, na základě první shody – díky tomu je rychlejší než řekněme pomocí IN a – na rozdíl od použití JOIN – nebude duplikovat řádky. Na části SELECT nezáleží – můžete ji změnit na EXISTS SELECT 1/0 ...
a dotaz bude stále fungovat, i když je zde zřejmé rozdělení nulovou chybou.
Poddotaz v rámci EXISTS
používá agregační funkci MIN k získání nejmenší B.some_val - pokud je tato hodnota větší než hodnota a.val, je a.val menší než všechny hodnoty b. Stačí pouze WHERE
klauzule je pro korelaci - agregační funkce lze použít pouze v HAVING
doložka.