Es posible tener una cláusula donde después de una cláusula HAVING?
Pregunta
Es posible el uso de una cláusula WHERE después de una cláusula HAVING?
La primera cosa que viene a la mente es sub consultas, pero no estoy seguro.
P.S. Si la respuesta es afirmativa, ¿podría dar algunos ejemplos?
Solución
No, no en la misma consulta.
La cláusula where
va delante de la having
y la group by
. Si desea filtrar los registros antes de la agrupación de la condición va en la cláusula where
, y si se desea filtrar registros agrupados la condición va en la cláusula having
:
select ...
from ...
where ...
group by ...
having ...
Si ninguno de los que son posibles de usar por alguna extraña razón, usted tiene que hacer la consulta una subconsulta para que pueda poner la cláusula where
en la consulta externa:
select ...
from (
select ...
from ...
where ...
group by ...
having ...
) x
where ...
Otros consejos
Una cláusula HAVING es sólo una cláusula donde después de un GROUP BY. ¿Por qué no poner las condiciones en las que en la cláusula HAVING?
Si es una pregunta con trampa, es posible si el WHERE y el que tiene no están al mismo nivel, como lo mencionado, la subconsulta.
supongo que algo así iba a funcionar
valor HAVING = (SELECT max (valor) a partir de foo DONDE crit = 123)
p.s .: ¿por qué estabas preguntando? ¿Tiene un problema específico?
p.s.s: OK tonto de mí, echaba de menos la "entrevista *" etiqueta ...
Desde ayudar a seleccionar
orden de procesamiento de WHERE, GROUP BY, y HAVING cláusulas Los siguientes pasos mostrar el orden de procesamiento para un SELECT declaración con una cláusula WHERE, un grupo POR cláusula, y una cláusula HAVING:
La cláusula FROM devuelve un inicial conjunto de resultados.
La cláusula WHERE excluye filas no el cumplimiento de su condición de búsqueda.
La cláusula GROUP BY recoge el seleccionado filas en un grupo para cada valor único en la cláusula GROUP BY.
Las funciones de agregación especificadas en el Calcular los valores de resumen lista de selección para cada grupo.
La cláusula HAVING adicionalmente excluye filas que no cumplen con su búsqueda condición.
Así que, no, no puedes.
Dentro del mismo ámbito, respuesta es no. Si se permite que las subconsultas entonces se puede evitar el uso de HAVING
por completo.
Creo HAVING
es un anacronismo. Hugh Darwen refiere a HAVING
como "La locura de consultas estructuradas":
En la antigua SQL, la cláusula no podía
WHERE
ser utilizado en resultados de la agregación, por lo tuvieron que inventarHAVING
(con igual el significado comoWHERE
):SELECT D#, AVG(Salary) AS Avg_Sal FROM Emp GROUP BY D# HAVING AVG(Salary) > 999;
Pero tendríamos que hemos tenido
HAVING
si en 1979 se podría escribir:SELECT * FROM ( SELECT D#, AVG(Sal) AS Avg_Sal FROM Emp GROUP BY D# ) AS dummy WHERE Avg_Sal > 999;
Sospecho fuertemente la respuesta a la pregunta de Darwen es no.