Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum sind doppelt verschachtelte NOT EXISTS-Anweisungen in SQL unvermeidlich?

Ihre Frage lautet:"Finden Sie alle Komponenten, die an alle Projekte in einer bestimmten Stadt geliefert werden/wurden." Sie formulieren dies um in "Finde alle Komponenten, bei denen es kein Projekt in einer bestimmten Stadt gibt, das die Komponente nicht hat."

Ich wäre eher geneigt, dies direkt zu beantworten:

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

Dieser zählt die Anzahl der unterschiedlichen Projekte in der Stadt und vergleicht sie mit der Anzahl der Projekte in der Stadt (der distinct id ist in der Unterabfrage wahrscheinlich nicht erforderlich.

Erstens bin ich mir nicht sicher, ob dies einfacher ist. Zweitens bin ich der Erste, der zugibt, dass der NOT EXISTS Methode kann effizienter sein, obwohl die Verschachtelung von NOT EXISTS in Unterabfragen kann die Leistung beeinträchtigen. Ich denke jedoch, dass dies einfacher zu befolgen ist.