PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

SQL:seleziona i record in cui TUTTI i record uniti soddisfano alcune condizioni

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.