Question

Est-il possible d'utiliser une clause WHERE après une clause HAVING?

La première chose qui me vient à l'esprit est des sous-requêtes, mais je ne suis pas sûr.

P.S. Si la réponse est affirmative, pourriez-vous donner quelques exemples?

Était-ce utile?

La solution

Non, pas dans la même requête.

La clause where précède le having et le group by. Si vous souhaitez filtrer les enregistrements avant le regroupement de la condition va dans la clause where, et si vous voulez filtrer l'état groupé enregistrements que va dans la clause having:

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

Si aucun des deux sont possibles à utiliser pour une raison étrange, vous devez faire la requête d'un sous-requête afin que vous puissiez mettre la clause where dans la requête externe:

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

Autres conseils

Une clause HAVING est juste une clause WHERE après un GROUP BY. Pourquoi ne pas mettre vos où les conditions dans la clause HAVING?

S'il est une question piège, il est possible que si le WHERE et having ne sont pas au même niveau, que vous mentionnais, avec sous-requête.

Je suppose que quelque chose comme ça fonctionnerait

  

= valeur HAVING (SELECT max (valeur) à partir de   foo OÙ crit = 123)

p.s .: Pourquoi avez-vous demandez? Avez-vous un problème spécifique?

p.s.s: OK silly me, j'ai raté le tag "entretien *" ...

De l'aide SELECT

  

Traitement des commandes de WHERE, GROUP BY,   et HAVING clauses Les étapes suivantes   montrer l'ordre de traitement pour un SELECT   déclaration avec une clause WHERE, un groupe   PAR clause et une clause HAVING:

     

La clause FROM renvoie une première   jeu de résultats.

     

La clause WHERE exclut les lignes non   rencontre son état de recherche.

     

La clause GROUP BY recueille les   lignes sélectionnées dans un groupe pour chaque   valeur unique dans la clause GROUP BY.

     

Fonctions agrégats spécifiés dans la   liste de sélection des valeurs récapitulatives de calcul   pour chaque groupe.

     

La clause HAVING en outre   exclut les lignes qui ne respectent pas la recherche   condition.

Alors, ne vous ne pouvez pas.

Dans le même champ, la réponse est non. Si les sous-requêtes est autorisé alors vous pouvez éviter d'utiliser entièrement HAVING.

Je pense que HAVING est un anachronisme. Hugh Darwen fait référence à HAVING comme « la folie des requêtes structurées »:

  

Dans l'ancien SQL, la clause ne pouvait pas WHERE   être utilisé sur les résultats de l'agrégation, de sorte que   ils ont dû inventer HAVING (avec la même   ce qui signifie que WHERE):

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

Mais est-ce que nous ayons jamais eu HAVING si   en 1979, on pourrait écrire:

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

Je soupçonne fortement la réponse à la question de Darwen est pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top