2009-11-04 18 views
13

Czy można użyć klauzuli WHERE po klauzuli HAVING?Możliwe jest mieć klauzulę WHERE po klauzula HAVING?

Pierwszą rzeczą, która przychodzi mi do głowy, są pod-zapytania, ale nie jestem pewien.

P.S. Jeśli odpowiedź jest twierdząca, czy mógłbyś podać kilka przykładów?

+3

Czy to jest pytanie dotyczące sztuczek/wywiadu, czy też masz prawdziwy problem do rozwiązania? – itsadok

+1

Tak. Pytanie pochodzi z wywiadu. –

Odpowiedz

25

Nie, nie w tym samym zapytaniu.

Klauzula where przechodzi przed having i group by.Jeśli chcesz odfiltrować rekordy przed grupowania stan przechodzi w klauzuli where, a jeśli chcesz, aby odfiltrować pogrupowane rejestruje stan przechodzi w having klauzuli:

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

Jeżeli żadna z tych są możliwe do wykorzystania dla jakiegoś dziwnego powodu, trzeba dokonać kwerendy podkwerenda, dzięki czemu można umieścić klauzulę where w zapytaniu zewnętrznym:

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

Klauzula HAVING jest po klauzuli WHERE po GRUPIE BY. Dlaczego nie umieścić warunków WHERE w klauzuli HAVING?

+3

+1 Dokładnie. Klauzula WHERE po HAVING nazywa się AND. – Andomar

+0

Pojęciowo klauzula HAVING jest stosowana po operacji GROUP BY, natomiast klauzula WHERE jest stosowana wcześniej, więc teoretycznie możliwa jest optymalizacja przez "filtrowanie" w klauzuli WHERE. W praktyce będziesz (jak zawsze) musiał patrzeć na to, jak optymalizuje to optymalizator, np. sprawdź plan wykonania. Weź też pod uwagę czytelnika, który normalnie spodziewałby się widzieć "filtrowanie" predykowane w klauzuli WHERE (zamiast klauzul przyłączyć, klauzul HAVING, itp.). – onedaywhen

2

Od SELECT pomoc

przetwarzania zamówień gdzie, GROUP BY, i posiadające Klauzule następujące kroki pokazują kolejność przetwarzania dla wybranej oświadczenie o klauzuli WHERE, grupa klauzulą, a klauzula HAVING:

Klauzula FROM zwraca początkowy zestaw wyników .

Klauzula WHERE wyklucza wiersze, a nie spełniające warunek wyszukiwania.

Klauzula GROUP BY zbiera wybrane wiersze w jednej grupie dla każdej unikalnej wartości w klauzuli GROUP BY.

Funkcje zagregowane określone na liście wyboru obliczają wartości podsumowania dla każdej grupy.

Klauzula HAVING dodatkowo wyklucza wiersze niespełniające jego warunku wyszukiwania.

Tak, nie, nie możesz.

5

Jeśli jest to podchwytliwe pytanie, jest możliwe, jeśli GDZIE i HAVING nie są na tym samym poziomie, jak wspomniano, z podzapytaniem.

Chyba coś takiego będzie działać

posiadające wartość = (SELECT max (wartość) Z foo WHERE crit = 123)

p.s .: dlaczego pytasz? Masz konkretny problem?

p.s.s: OK głupio mi, brakowało mi "wywiad *" tag ...

0

w takim samym zakresie, odpowiedź brzmi: nie. Jeśli podzapytania są dozwolone, możesz całkowicie uniknąć korzystania z HAVING.

Myślę, że HAVING jest anachronizmem. Hugh Darwen dotyczy HAVING jako „szaleństwo strukturyzowanych zapytania”:

W starym SQL, klauzula WHERE nie mógł być stosowany na wynikach agregacji, więc musieli wynaleźć HAVING (z tego samego rozumieniu jako WHERE):

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

Ale czy my kiedykolwiek mieli HAVING jeśli w 1979 roku można było napisać:

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

Podejrzewam, że odpowiedź na pytanie Darwen jest nie.

Powiązane problemy