Возможно ли иметь предложение WHERE после предложения HAVING?

StackOverflow https://stackoverflow.com/questions/1671968

  •  13-09-2019
  •  | 
  •  

Вопрос

Можно ли использовать предложение WHERE после предложения HAVING?

Первое, что приходит мне в голову, - это вложенные запросы, но я не уверен.

P.S.Если ответ утвердительный, не могли бы вы привести несколько примеров?

Это было полезно?

Решение

Нет, не в том же запросе.

В where предложение идет перед having и тот group by.Если вы хотите отфильтровать записи перед группировкой, условие переходит в where предложение, и если вы хотите отфильтровать сгруппированные записи, условие переходит в having оговорка:

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

Если ни один из них невозможно использовать по какой-либо странной причине, вам нужно сделать запрос подзапросом, чтобы вы могли поместить where предложение во внешнем запросе:

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

Другие советы

Предложение HAVING - это просто предложение WHERE после GROUP BY .Почему бы не поместить ваши условия WHERE в предложение HAVING?

Если это вопрос с подвохом, это возможно, если WHERE и HAVING не находятся на одном уровне, как вы упомянули, с подзапросом.

Я думаю, что что-то подобное сработало бы

ИМЕЮЩИЙ значение=(ВЫБЕРИТЕ max (значение) ИЗ foo, ГДЕ crit =123)

p.s.:почему ты спрашиваешь?У вас есть какая-то конкретная проблема?

p.s.s:Ладно, глупый я, я пропустил тег "интервью *"...

Из ВЫБЕРИТЕ справка

Порядок обработки предложений WHERE, GROUP BY, и HAVING Следующие шаги показывают порядок обработки для оператора SELECT с предложением WHERE, предложением GROUP BY и предложением HAVING:

Предложение FROM возвращает начальный результирующий набор.

Предложение where исключает строки, которые не встреча его условия поиска.

Предложение GROUP BY собирает выбранные строки в одну группу для каждого уникального значения в предложении GROUP BY.

Агрегатные функции, указанные в списке выбор, вычисляют итоговые значения для каждой группы.

Предложение HAVING дополнительно исключает строки, не соответствующие его условиям поиска .

Итак, нет, вы не можете.

В тех же рамках ответ - "нет".Если подзапросы разрешены, то вы можете избежать использования HAVING полностью.

Я думаю, что HAVING это анахронизм.Хью Дарвен ссылается на HAVING как "Безумие структурированных запросов":

В старом SQL, the WHERE предложение не могло использоваться для результатов агрегирования, поэтому им пришлось изобрести HAVING (с тем же значением, что и WHERE):

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

Но были бы у нас когда-нибудь HAVING если бы в 1979 году можно было написать:

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

Я сильно подозреваю, что ответ на вопрос Дарвен - "нет".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top