sql >> Base de Datos >  >> RDS >> PostgreSQL

SQL:seleccione registros donde TODOS los registros unidos cumplan alguna condición

Suponiendo que no hay necesidad de correlación, use:

SELECT a.*
  FROM A a
 WHERE EXISTS(SELECT NULL
                FROM B b
              HAVING MIN(b.some_val) > a.val)

Si necesita correlación:

SELECT a.*
  FROM A a
 WHERE EXISTS(SELECT NULL
                FROM B b
               WHERE b.id = a.id
              HAVING MIN(b.some_val) > a.val)

Explicación

El EXISTS se evalúa en un booleano, basado en la primera coincidencia; esto lo hace más rápido que usar IN y, a diferencia de usar JOIN, no duplicará filas. La parte SELECCIONAR no importa:puede cambiarla a EXISTS SELECT 1/0 ... y la consulta seguirá funcionando aunque hay un error obvio de división por cero.

La subconsulta dentro de EXISTS usa la función agregada MIN para obtener el valor B.some_val más pequeño; si ese valor es mayor que el valor a.val, el valor a.val es menor que todos los valores b. La única necesidad de un WHERE la cláusula es para la correlación:las funciones agregadas solo se pueden usar en HAVING cláusula.