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.