Förutsatt att det inte behövs någon korrelation, använd:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
HAVING MIN(b.some_val) > a.val)
Om du behöver korrelation:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
WHERE b.id = a.id
HAVING MIN(b.some_val) > a.val)
Förklaring
EXISTS
utvärderar på en boolean, baserat på den första matchningen - detta gör det snabbare än att säg att använda IN, och - till skillnad från att använda en JOIN - kommer inte att duplicera rader. SELECT-delen spelar ingen roll - du kan ändra den till EXISTS SELECT 1/0 ...
och frågan kommer fortfarande att fungera även om det finns en uppenbar division med nollfel.
Underfrågan inom EXISTS
använder aggregatfunktionen MIN för att få det minsta B.some_val - om det värdet är större än a.val-värdet är a.val mindre än alla b-värden. Det enda behovet av en WHERE
sats är för korrelation - aggregerade funktioner kan endast användas i HAVING
klausul.