Suponiendo que no hay necesidad de correlación, use:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
HAVING MIN(b.some_val) > a.val)
Si necesita correlación:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
WHERE b.id = a.id
HAVING MIN(b.some_val) > a.val)
Explicación
El EXISTS
se evalúa en un booleano, basado en la primera coincidencia; esto lo hace más rápido que usar IN y, a diferencia de usar JOIN, no duplicará filas. La parte SELECCIONAR no importa:puede cambiarla a EXISTS SELECT 1/0 ...
y la consulta seguirá funcionando aunque hay un error obvio de división por cero.
La subconsulta dentro de EXISTS
usa la función agregada MIN para obtener el valor B.some_val más pequeño; si ese valor es mayor que el valor a.val, el valor a.val es menor que todos los valores b. La única necesidad de un WHERE
la cláusula es para la correlación:las funciones agregadas solo se pueden usar en HAVING
cláusula.