2015-03-09 5 views
5

Ich lese die oracle documentation auf die ANY und ALL-Operatoren. Ich verstehe ihre Verwendung bis auf eine Sache. Darin heißt es:ALL Operator VS Any für eine leere Abfrage

ALL:

Wenn eine Unterabfrage gibt Zeilen Null, die Bedingung TRUE ergibt.

ANY:

Wenn eine Unterabfrage gibt Zeilen Null, wertet die Bedingung FALSCH.

Es scheint mir nicht sehr logisch. Warum würde ALL für eine leere Unterabfrage TRUE zurückgeben, aber ANY gibt FALSE zurück?

Ich bin relativ neu in SQL, also nehme ich an, dass es einen Anwendungsfall für dieses Verhalten haben würde, das wirklich kontraintuitiv zu mir ist.

ALLE und alle auf eine leere Menge sollte den gleichen Wert nein zurückgeben?

Antwort

4

Da ANY als EXIST interpretiert werden soll (wenn es welche gibt, bedeutet es, dass sie existieren). Daher gibt es false zurück, wenn keine Zeilen gefunden werden.

All bestätigt nicht, dass irgendwelche Werte existieren, es bestätigt nur, dass es alle möglichen Werte darstellt. Daher wird True zurückgegeben, auch wenn keine Zeilen gefunden werden.

+2

Es lohnt sich, ein Beispiel zu nennen: Wenn Sie einen Scheck wie 'empSalary> ALL haben (wählen Sie Gehalt von someTable) 'wenn es keine rows auf' select salary von someTable 'gibt, wird es als wahr ausgewertet, weil der Wert, den du kontrollierst, größer ist als'alle Werte (auch wenn sie nicht existieren)' :) –

5

Betrachten Sie das Beispiel der EMP Tabelle in diesem Link.

Insbesondere diese Abfrage -

SELECT e1.empno, e1.sal 
FROM emp e1 
WHERE e1.sal > ANY (SELECT e2.sal 
        FROM emp e2 
        WHERE e2.deptno = 20); 

Bei ANY, die Frage, die Sie fragen werden, ist: "Ist mein Gehalt größer als jeder andere in Abteilung 20 (mindestens 1 Person)". Dies bedeutet, dass Sie hoffen, mindestens eine Person hat ein Gehalt weniger als Sie. Wenn es keine Zeilen gibt, gibt das FALSE zurück, weil es niemanden gibt, dessen Gehalt niedriger ist als du, du hast auf mindestens eins gehofft.

Im Falle von ALL, die offensichtliche Frage, die Sie fragen würden, ist "Ist mein Gehalt größer als jeder?". Um es anders zu formulieren: "Gibt es niemanden, der mehr Gehalt hat als ich?" Wenn keine Zeilen zurückgegeben werden, ist Ihre Antwort TRUE, weil "es gibt niemanden, dessen Gehalt höher ist als ich.

Verwandte Themen