PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

SQL:Selecione registros onde TODOS os registros unidos satisfazem alguma condição


Assumindo que não há necessidade de correlação, use:
SELECT a.*
  FROM A a
 WHERE EXISTS(SELECT NULL
                FROM B b
              HAVING MIN(b.some_val) > a.val)

Se você precisar de correlação:
SELECT a.*
  FROM A a
 WHERE EXISTS(SELECT NULL
                FROM B b
               WHERE b.id = a.id
              HAVING MIN(b.some_val) > a.val)

Explicação


O EXISTS avalia em um booleano, com base na primeira correspondência - isso o torna mais rápido do que usar IN e - ao contrário de usar um JOIN - não duplicará linhas. A parte SELECT não importa - você pode alterá-la para EXISTS SELECT 1/0 ... e a consulta ainda funcionará, embora haja uma divisão óbvia por erro zero.

A subconsulta dentro do EXISTS usa a função agregada MIN para obter o menor B.some_val - se esse valor for maior que o valor a.val, o a.val será menor que todos os valores b. A única necessidade de um WHERE cláusula é para correlação - funções agregadas só podem ser usadas no HAVING cláusula.