Assumindo que não há necessidade de correlação, use:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
HAVING MIN(b.some_val) > a.val)
Se você precisar de correlação:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
WHERE b.id = a.id
HAVING MIN(b.some_val) > a.val)
Explicação
O
EXISTS
avalia em um booleano, com base na primeira correspondência - isso o torna mais rápido do que usar IN e - ao contrário de usar um JOIN - não duplicará linhas. A parte SELECT não importa - você pode alterá-la para EXISTS SELECT 1/0 ...
e a consulta ainda funcionará, embora haja uma divisão óbvia por erro zero. A subconsulta dentro do
EXISTS
usa a função agregada MIN para obter o menor B.some_val - se esse valor for maior que o valor a.val, o a.val será menor que todos os valores b. A única necessidade de um WHERE
cláusula é para correlação - funções agregadas só podem ser usadas no HAVING
cláusula.