ИСПОЛЬЗОВАНИЕ без GROUP BY

  • Возможно ли следующее в соответствии со стандартным (!) SQL?
  • Какие минимальные изменения должны быть необходимы для соответствия стандарту (если он еще не был)?
  • Он работает так, как ожидалось, в MySQL, если первая строка имеет максимальное значение для NumberOfPages.

SELECT * FROM Book HAVING NumberOfPages = MAX(NumberOfPages)

В стандарте написано:

HAVING <search condition>

  • Пусть G - это множество, состоящее из каждого столбца, на который ссылается ссылка < column reference > , содержащаяся в разделе < group by > .
  • Каждая ссылка на столбец, непосредственно содержащаяся в < условие поискa > , должна быть одной из следующих:
    • Недвусмысленная ссылка на столбец, функционально зависимый от G.
    • Внешняя ссылка.

источник

Может кто-нибудь объяснить мне, почему это должно быть возможно в соответствии со стандартом?

В MySQL он отлично работает.

Ответ 1

Несмотря на результат Mimer Validator, я не считаю ваш действительным стандартный SQL.

Предложение

A HAVING без предложения GROUP BY является допустимым и (возможно) полезным синтаксисом в стандартном SQL. Поскольку он работает с табличным выражением all-at-once в качестве набора, так сказать, действительно имеет смысл использовать агрегатные функции. В вашем примере:

Book HAVING NumberOfPages = MAX(NumberOfPages)

недействителен, так как при рассмотрении всей таблицы, к которой относится строка NumberOfPages? Точно так же имеет смысл использовать литеральные значения в предложении SELECT.

Рассмотрим этот пример, который действителен. Стандартный SQL:

 SELECT 'T' AS result
   FROM Book
 HAVING MIN(NumberOfPages) < MAX(NumberOfPages);

Несмотря на отсутствие ключевого слова DISTINCT, запрос никогда не вернет более одной строки. Если условие HAVING выполнено, то результатом будет одна строка с одним столбцом, содержащим значение "T" (указывающее, что у нас есть книги с разным количеством страниц), иначе результатом будет пустое множество, то есть нулевые строки с один столбец.

Я думаю, что причина, по которой запрос не вызывает ошибку в mySQL, объясняется наличием приватных расширений, которые приводят к тому, что предложение HAVING (логически) возникает после предложения SELECT (стандартное поведение - это наоборот), в сочетании с неявным предложением GROUP BY, упомянутым в других ответах.

Ответ 2

Из стандарта (выделено жирным шрифтом с акцентом)

1) Пусть HC - условие принадлежности. Пусть TE - табличное выражение, которое немедленно содержит HC. Если TE не сразу содержит предложение group by, тогда "GROUP BY()" неявно.. Пусть T - дескриптор таблицы, определенной GBC, непосредственно содержащейся в TE, и пусть R результат GBC.

С неявным предложением group by внешняя ссылка может обращаться к столбцам TE.

Тем не менее, сертификация этих стандартов в наши дни очень самоподтверждена, и приведенный вами пример не будет работать со всеми основными поставщиками РСУБД.