sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué las declaraciones NOT EXISTS de doble anidamiento son inevitables en SQL?

Su pregunta es:"Encuentre todos los componentes que se enviaron/se enviaron a todos los proyectos en una ciudad específica". Está reformulando esto como "Encuentre todos los componentes donde no haya ningún proyecto en una ciudad determinada que no tenga el componente".

Me inclinaría más a responder esto directamente:

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'
                                 );

Esto cuenta el número de proyectos distintos en la ciudad y los compara con el número de proyectos en la ciudad (el distinct id probablemente no sea necesario en la subconsulta.

Primero, no estoy seguro si esto es más simple. Segundo, soy el primero en admitir que NOT EXISTS método puede ser más eficiente, aunque el anidamiento de NOT EXISTS en subconsultas puede ser perjudicial para el rendimiento. Sin embargo, creo que esto es más fácil de seguir.