Ervan uitgaande dat er geen correlatie nodig is, gebruikt u:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
HAVING MIN(b.some_val) > a.val)
Als je correlatie nodig hebt:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
WHERE b.id = a.id
HAVING MIN(b.some_val) > a.val)
Uitleg
De EXISTS
evalueert op een boolean, gebaseerd op de eerste overeenkomst - dit maakt het sneller dan bijvoorbeeld IN te gebruiken, en - in tegenstelling tot het gebruik van een JOIN - zal het geen rijen dupliceren. Het SELECT-gedeelte doet er niet toe - u kunt het wijzigen in EXISTS SELECT 1/0 ...
en de query zal nog steeds werken, hoewel er een duidelijke fout bij deling door nul is.
De subquery binnen de EXISTS
gebruikt de aggregatiefunctie MIN om de kleinste B.some_val te krijgen - als die waarde groter is dan de a.val-waarde, is de a.val kleiner dan alle b-waarden. De enige behoefte aan een WHERE
clausule is voor correlatie - geaggregeerde functies kunnen alleen worden gebruikt in de HAVING
clausule.