2017-01-19 2 views
0
Emp(eid: integer, ename: string, age: integer, salary: real) 

Works(eid: integer, did: integer, pct time: integer) 

Dept(did: integer, dname: string, budget: real, managerid: integer) 
SELECT DISTINCT D.managerid 

FROM Dept D 

WHERE 1000000 < ALL (SELECT D2.budget 
FROM Dept D2 
WHERE D2.managerid = D.managerid) 


other one: 
SELECT DISTINCT managerid FROM dept WHERE dept.budget > 1000000 

Sie erhalten beide die ID von Managern, die in Abteilungen mit einem Budget von mehr als 1 Million arbeiten. Entschuldige die Formatierung.Was ist der Unterschied zwischen diesen beiden einfachen SQL-Abfragen?

+0

Einer von ihnen verwendet unnötigerweise eine Unterabfrage, die die Leistung beeinträchtigen kann. Sie sind semantisch gleich. – PinnyM

+0

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). –

+0

@KenWhite, was meinst du mit Ausführungsplan? – Mikael

Antwort

2

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:

ALL operator in pictures

Verwandte Themen