Pergunta

É possível usar uma cláusula WHERE após uma cláusula HAVING?

A primeira coisa que vem à minha mente é sub consultas, mas não tenho certeza.

P.S. Se a resposta for afirmativa, você poderia dar alguns exemplos?

Foi útil?

Solução

Não, não na mesma consulta.

A cláusula where vai antes do having eo group by. Se você quiser filtrar os registros antes do agrupamento a condição vai na cláusula where, e se você quiser filtrar os registros agrupados a condição vai na cláusula having:

select ...
from ...
where ...
group by ...
having ...

Se nenhum desses são possíveis de usar por algum motivo estranho, você tem que fazer a consulta uma subconsulta de modo que você pode colocar a cláusula where na consulta externa:

select ...
from (
   select ...
   from ...
   where ...
   group by ...
   having ...
) x
where ...

Outras dicas

A cláusula HAVING é apenas uma cláusula WHERE após um GROUP BY. Por que não colocar o seu ONDE condições na cláusula HAVING?

Se for uma pergunta capciosa, é possível se o ONDE eo TENDO não estão no mesmo nível, como você mencionada, com subconsulta.

Eu acho que algo como isso iria funcionar

valor TENDO = (SELECT max (valor) FROM foo ONDE crit = 123)

P.S .: por que você estava perguntando? Você tem um problema específico?

p.s.s: OK bobo mim, eu perdi a "entrevista *" tag ...

De ajudar a selecionar

Processamento da ordem de WHERE, GROUP BY, e TENDO Cláusulas Os passos seguintes mostrar a ordem de processamento para um SELECT declaração com uma cláusula WHERE, um grupo BY e uma cláusula HAVING:

A cláusula FROM retorna uma inicial conjunto de resultados.

exclui a cláusula WHERE linhas não conhecer a sua condição de pesquisa.

A cláusula GROUP BY recolhe o seleccionado linhas em um grupo para cada valor único na cláusula GROUP BY.

As funções de agregação especificada no selecione lista valores de resumo calcular para cada grupo.

A cláusula HAVING adicionalmente exclui linhas que não cumprem a sua pesquisa condição.

Então, não, você não pode.

Dentro do mesmo âmbito, a resposta não é. Se subconsultas é permitido, então você pode evitar o uso HAVING inteiramente.

Eu acho HAVING é um anacronismo. Hugh Darwen refere-se a HAVING como "a loucura de consultas estruturadas":

No SQL idade, a cláusula WHERE não podia ser utilizada em resultados de agregação, assim eles tiveram que inventar HAVING (com a mesma ou seja, como WHERE):

SELECT D#, AVG(Salary) AS Avg_Sal
  FROM Emp
 GROUP 
    BY D#
HAVING AVG(Salary) > 999;

Mas será que alguma vez tiveram HAVING se em 1979, pode-se escrever:

SELECT * 
  FROM (
        SELECT D#, AVG(Sal) AS Avg_Sal
          FROM Emp
         GROUP 
            BY D# 
       )
      AS dummy
WHERE Avg_Sal > 999;

Eu suspeito fortemente a resposta à pergunta de Darwen não é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top