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

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

Я думаю, что-то вроде этого будет работать

Значение HAVING = (SELECT max (значение) FROM foo WHERE crit = 123)

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

p.s.s: ОК, глупо меня, я пропустил тег "интервью"...

Ответ 3

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

Ответ 4

В справке SELECT

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

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

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

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

Совокупные функции, указанные в select list вычисляет суммарные значения для каждой группы.

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

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

Ответ 5

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

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

В старом SQL предложение 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;

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