Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que as instruções NOT EXISTS aninhadas duplas são inevitáveis ​​no SQL


Sua pergunta é:"Encontre todos os componentes que são/foram enviados para todos os projetos em uma cidade específica." Você está reformulando isso como "Encontre todos os componentes onde não há nenhum projeto em uma determinada cidade que não tenha o componente".

Eu estaria mais inclinado a responder isso diretamente:
select scp.component
from scp join
     projects p
     on scp.pnr = p.pnr
where p.city = 'Foobar Town'
group scp.component
having count(distinct scp.pnr) = (select count(distinct pnr)
                                  from projects
                                  where city = 'Foobar Town'
                                 );

Isso conta o número de projetos distintos na cidade e os compara com o número de projetos na cidade (o distinct id provavelmente não é necessário na subconsulta.

Primeiro, não tenho certeza se isso é mais simples. Em segundo lugar, sou o primeiro a admitir que o NOT EXISTS método pode ser mais eficiente, embora o aninhamento de NOT EXISTS em subconsultas pode ser prejudicial ao desempenho. Eu, no entanto, acho que isso é mais fácil de seguir.