E 'possibile avere una clausola WHERE dopo una clausola HAVING?
Domanda
E 'possibile utilizzare una clausola WHERE dopo una clausola HAVING?
La prima cosa che mi viene in mente è query sub, ma non sono sicuro.
P.S. Se la risposta è affermativa, potrebbe fare qualche esempio?
Soluzione
No, non nella stessa query.
La clausola where
va prima della having
e group by
. Se si desidera filtrare i record prima del raggruppamento la condizione va nella clausola where
, e se si desidera filtrare raggruppati registra la condizione va nella clausola having
:
select ...
from ...
where ...
group by ...
having ...
Se nessuno di questi sono possibili da utilizzare per qualche strana ragione, è necessario effettuare la query una sottoquery in modo che si può mettere la clausola where
nella query esterna:
select ...
from (
select ...
from ...
where ...
group by ...
having ...
) x
where ...
Altri suggerimenti
Una clausola HAVING è solo una clausola WHERE dopo una GROUP BY. Perché non mettere le condizioni in cui nella clausola HAVING?
Se è una domanda trabocchetto, è possibile se la WHERE e HAVING non sono allo stesso livello, come lei menzionate, con subquery.
Credo che qualcosa di simile potrebbe funzionare
Valore CHE HA = (SELECT max (valore) FROM foo DOVE crit = 123)
P.S .: perché stavi chiedendo? Avete un problema specifico?
p.s.s: OK stupido me, ho perso il "intervista *" tag ...
Da Guida Selezionare
elaborazione degli ordini di WHERE, GROUP BY, e HAVING Clausole Le seguenti operazioni mostrare l'ordine di elaborazione per un SELECT dichiarazione con una clausola WHERE, un gruppo BY, e una clausola HAVING:
La clausola FROM restituisce un primo set di risultati.
La clausola WHERE esclude righe non incontrare la sua condizione di ricerca.
La clausola GROUP BY raccoglie il righe selezionate in un gruppo per ogni valore unico nella clausola GROUP BY.
funzioni di aggregazione specificate nel selezionare Elenco valori di riepilogo calcolare per ogni gruppo.
La clausola HAVING inoltre esclude le righe che non soddisfano la sua ricerca condizioni.
Quindi, no non si può.
A parità di perimetro, risposta è no. Se sottoquery è consentito allora si può evitare di usare HAVING
del tutto.
Credo HAVING
è un anacronismo. Hugh Darwen si riferisce a HAVING
come "la follia di query strutturata":
Nel vecchio SQL, la clausola non poteva
WHERE
essere utilizzato su risultati di aggregazione, così hanno dovuto inventareHAVING
(con lo stesso che significa comeWHERE
):SELECT D#, AVG(Salary) AS Avg_Sal FROM Emp GROUP BY D# HAVING AVG(Salary) > 999;
Ma avremmo mai avuto
HAVING
se nel 1979 si potrebbe scrivere:SELECT * FROM ( SELECT D#, AVG(Sal) AS Avg_Sal FROM Emp GROUP BY D# ) AS dummy WHERE Avg_Sal > 999;
Ho il forte sospetto la risposta alla domanda di Darwen è no.