Supponendo che non sia necessaria alcuna correlazione, utilizzare:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
HAVING MIN(b.some_val) > a.val)
Se hai bisogno di una correlazione:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
WHERE b.id = a.id
HAVING MIN(b.some_val) > a.val)
Spiegazione
Il EXISTS
valuta su un valore booleano, in base alla prima corrispondenza:questo lo rende più veloce rispetto all'utilizzo di IN e, a differenza dell'utilizzo di JOIN, non duplicherà le righe. La parte SELECT non ha importanza:puoi cambiarla in EXISTS SELECT 1/0 ...
e la query funzionerà comunque anche se c'è un'ovvia divisione per zero errori.
La sottoquery all'interno di EXISTS
utilizza la funzione di aggregazione MIN per ottenere il valore B.some_val più piccolo:se quel valore è maggiore del valore a.val, a.val è inferiore a tutti i valori b. L'unico bisogno di un WHERE
La clausola è per la correlazione:le funzioni aggregate possono essere utilizzate solo in HAVING
clausola.