2015-03-09 6 views
5

Czytam oracle documentation na DOWOLNYM i WSZYSTKIM operatorze. Rozumiem ich zastosowania, z wyjątkiem jednej rzeczy. Stwierdza:ALL operator VS Dowolny na pustym zapytaniu

WSZYSTKIE:

Jeżeli podzapytanie zwraca zera wierszy, warunek jest prawdziwy.

ANY:

Jeżeli podzapytanie zwraca zera wierszy, stan FALSE.

Nie wydaje mi się to zbyt logiczne. Dlaczego ALL na pustym podzapytaniu zwróci wartość PRAWDA, ale KAŻDY zwróci FALSE?

Jestem względnie nowy w SQL, więc zakładam, że byłby to przypadek użycia dla tego zachowania, który jest dla mnie bardzo intuicyjny.

WSZYSTKIE i WSZYSTKIE na pustym zestawie powinny zwracać tę samą wartość, nie?

Odpowiedz

4

Ponieważ ANY należy interpretować jako EXIST (jeśli jest, oznacza to, że istnieją). Dlatego zwraca wartość false, jeśli nie znaleziono żadnych wierszy.

All nie poświadcza, że ​​istnieją wartości, tylko poświadcza, że ​​reprezentuje wszystkie możliwe wartości. Dlatego zwraca true, nawet jeśli nie znaleziono żadnych wierszy.

+2

Warto wspomnieć o przykładzie: Jeśli masz sprawdzenie, jak "EmpSalary> ALL" (wybierz wynagrodzenie from someTable) 'jeśli nie ma żadnych wierszy na' select payary from someTable', to znaczy, że wartość jest większa niż "wszystkie wartości (nawet jeśli nie istnieją)" :) –

5

Rozważ przykład tabeli EMP w tym łączu.

Konkretnie to zapytanie -

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

W przypadku jakichkolwiek pytanie prosicie to „Czy moja pensja większa niż ktokolwiek w dziale 20 (co najmniej 1 osoba)”. Oznacza to, że masz nadzieję, że co najmniej jedna osoba ma jedną pensję mniej niż ty. Gdy nie ma wierszy, to zwraca FALSE, ponieważ nie ma nikogo, którego pensja jest mniejsza od ciebie, masz nadzieję na co najmniej jeden.

W przypadku WSZYSTKIEGO, oczywistym pytaniem, które zadajesz, jest "Czy moja pensja jest większa niż wszyscy?". Przeformułowałem to jako "Czy nie ma nikogo, kto ma wyższą pensję ode mnie?" Kiedy nie ma żadnych wierszy zwróconych, twoja odpowiedź brzmi: TRUE, ponieważ "rzeczywiście nie ma nikogo, kto ma wyższą pensję ode mnie."