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

Hvorfor er dobbelt indlejrede NOT EXISTS-sætninger uundgåelige i SQL

Dit spørgsmål er:"Find alle komponenter, der er/blev sendt til alle projekter i en bestemt by." Du omformulerer dette som "Find alle komponenter, hvor der ikke er noget projekt i en given by, der ikke har komponenten."

Jeg ville være mere tilbøjelig til at svare direkte på dette:

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

Dette tæller antallet af særskilte projekter i byen og sammenligner dem med antallet af projekter i byen (den distinct id sandsynligvis ikke nødvendigt i underforespørgslen.

For det første er jeg ikke sikker på, om dette er enklere. For det andet er jeg den første til at indrømme, at NOT EXISTS metode kan være mere effektiv, selvom indlejringen af ​​NOT EXISTS i underforespørgsler kan være skadeligt for ydeevnen. Jeg tror dog, at dette er lettere at følge.




  1. Forskellene mellem INT og UUID i MySQL

  2. Hvordan øger man den maksimale uploadfilstørrelse for LOAD DATA INFILE-forespørgslen?

  3. Forhindrer brug af WordPress get_results()-databasefunktionen sql-injektion

  4. MySQL ON DUPLICATE KEY OPDATERING, mens du indsætter et resultatsæt fra en forespørgsel