Zakładając, że nie ma potrzeby korelacji, użyj:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
HAVING MIN(b.some_val) > a.val)
Jeśli potrzebujesz korelacji:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
WHERE b.id = a.id
HAVING MIN(b.some_val) > a.val)
Wyjaśnienie
EXISTS
ocenia na podstawie wartości logicznej, na podstawie pierwszego dopasowania — to czyni to szybciej niż powiedzmy przy użyciu IN i — w przeciwieństwie do używania JOIN — nie powiela wierszy. Część SELECT nie ma znaczenia - możesz ją zmienić na EXISTS SELECT 1/0 ...
a zapytanie nadal będzie działać, chociaż istnieje oczywisty błąd dzielenia przez zero.
Podzapytanie w EXISTS
używa funkcji agregującej MIN, aby uzyskać najmniejszą wartość B.some_val — jeśli ta wartość jest większa niż wartość a.val, a.val jest mniejsza niż wszystkie wartości b. Jedyną potrzebą jest WHERE
Klauzula dotyczy korelacji - funkcje agregujące mogą być używane tylko w HAVING
klauzula.