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?

È stato utile?

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 inventare HAVING (con lo stesso   che significa come WHERE):

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top