2015-03-09 12 views
5

Sto leggendo lo oracle documentation sugli operatori ANY e ALL. Capisco abbastanza bene i loro usi tranne che per una cosa. Essa afferma:TUTTI gli operatori VS Qualsiasi su una query vuota

ALL:

Se una sottoquery non restituisce zero righe, la condizione restituisce TRUE.

QUALSIASI:

Se una sottoquery non restituisce zero righe, la condizione restituisce FALSE.

Non mi sembra molto logico. Perché TUTTI su una subquery vuota restituire VERO ma QUALUNQUE restituisce FALSO?

Sono relativamente nuovo a SQL, quindi presumo che avrebbe un caso d'uso per questo comportamento che è davvero contro-intuitivo per me.

ANY e ALL su un set vuoto devono restituire lo stesso valore no?

risposta

4

Perché ANY deve essere interpretato come EXIST (se ce n'è uno, significa che esistono). Pertanto, restituisce false se non vengono trovate righe.

All non certifica che esistono valori, solo certifica che rappresenta tutti i valori possibili. Pertanto, restituisce true anche se non vengono trovate righe.

+2

Vale la pena menzionare un esempio: se hai un assegno per fare come" empSalary> ALL (seleziona salario da someTable) 'se non ci sono righe su' seleziona lo stipendio da qualcheTabella' valuta su true perché il valore che stai controllando è più grande di tutti i valori (anche se non esistono) ':) –

5

Considerare l'esempio della tabella EMP in tale collegamento.

In particolare questa ricerca -

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

in caso di qualsiasi, la questione si sta chiedendo è "è il mio stipendio maggiore di chiunque nel reparto 20 (almeno 1 persona)". Questo significa che speri che almeno una persona abbia uno stipendio inferiore a te. Quando non ci sono righe, questo restituisce FALSE perché non c'è nessuno il cui stipendio è inferiore a te, speravi in ​​almeno uno.

Nel caso di TUTTI, la domanda ovvia che si potrebbe porre è "Il mio salario è più grande di tutti?". Riprendendo ciò come "C'è nessuno che ha un salario più grande di me?" Quando non ci sono righe restituite, la tua risposta è TRUE, perché "non c'è nessuno il cui stipendio è più grande di me