Der Unterschied ist mit dem Operator ALL
. Lesen Sie here über den Operator ALL, wenn es mit den Vergleichsoperatoren verwendet wird.
Der Unterschied wird für die Fälle sein, in denen ein Manager mehrere Abteilungen überwacht.
Wenn Sie einen Manager, der nach diesen beiden Abteilungen aus:
declare @Dept table (did integer, dname varchar(20), budget real, managerid integer)
insert into @Dept values(1, 'dept1', 10, 1),(2, 'dept2', 20000000, 1)
Dann wird die erste Abfrage werden Ihnen keine Ergebnisse geben, als der Manager mit dem MANAGERID = 1 eine Abteilung mit Budget hat über und weniger dann 1000000
SELECT DISTINCT D.managerid
FROM @Dept D
WHERE 1000000 < ALL (SELECT D2.budget
FROM @Dept D2
WHERE D2.managerid = D.managerid)
managerid
-----------
(0 row(s) affected)
die zweite Abfrage gibt zum Glück das Ergebnis:
SELECT DISTINCT managerid FROM @dept WHERE budget > 1000000
managerid
-----------
1
(1 row(s) affected)
UPDATE: machen die beiden Abfragen gleichwertig Sie den ANY
Operator verwenden:
SELECT DISTINCT D.managerid
FROM @Dept D
WHERE 1000000 < ANY (SELECT D2.budget
FROM @Dept D2
WHERE D2.managerid = D.managerid)
managerid
-----------
1
(1 row(s) affected)
Ich habe das Bild von der URL oben hier hinzugefügt, der Vollständigkeit halber:
Einer von ihnen verwendet unnötigerweise eine Unterabfrage, die die Leistung beeinträchtigen kann. Sie sind semantisch gleich. – PinnyM
Sehen Sie sich den Ausführungsplan für jede Abfrage an. Wie Sie dies tun, hängt davon ab, welches RDBMS Sie verwenden, das Sie nicht angegeben haben (obwohl es beim Hinzufügen des SQL-Tags vorgeschlagen wurde). –
@KenWhite, was meinst du mit Ausführungsplan? – Mikael