Mysql
 sql >> Database >  >> RDS >> Mysql

Perché le istruzioni NOT EXISTS nidificate doppie sono inevitabili in SQL

La tua domanda è:"Trova tutti i componenti che sono stati spediti a tutti i progetti in una città specifica". Lo stai riformulando come "Trova tutti i componenti in cui non esiste alcun progetto in una determinata città che non abbia il componente".

Sarei più propenso a rispondere direttamente a questo:

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

Questo conta il numero di progetti distinti nella città e li confronta con il numero di progetti nella città (il distinct id probabilmente non è necessario nella sottoquery.

Innanzitutto, non sono sicuro che sia più semplice. Secondo, sono il primo ad ammettere che il NOT EXISTS metodo può essere più efficiente, sebbene l'annidamento di NOT EXISTS nelle sottoquery può essere dannoso per le prestazioni. Tuttavia, penso che questo sia più facile da seguire.