Ответ 1
Мое понимание: Да, в принципе, HAVING работает на строках. Опуская GROUP BY, он работает со всеми результирующими строками внутри одной "супергруппы", а не по группам внутри групп. Прочтите раздел "Как группировать и иметь запросы с агрегатами" в исходной ссылке Sybase docco: -
Как работает группа и запросы с агрегатами
- Предложение where исключает строки, которые не соответствуют условиям поиска; его функция остается неизменной для сгруппированных или негрупповых запросов.
- Предложение group by собирает оставшиеся строки в одну группу для каждого уникального значения в выражении по выражению. Опускание группы с помощью создает отдельную группу для всей таблицы.
- Совокупные функции, указанные в списке выбора, вычисляют суммарные значения для каждой группы. Для скалярных агрегатов для таблицы есть только одно значение. Векторный агрегат вычисляет значения для отдельных групп.
- Предложение с исключает группы из результатов, которые не соответствуют условиям поиска. Даже если предложение с проверяет только строки, наличие или отсутствие предложения по может заставить его работать в группах:
- Когда запрос включает группу, с исключает строки группы результатов. Вот почему с работает в группах.
- Когда запрос не имеет группы, с исключает строки результатов из таблицы (одной группы). Вот почему с работает в строках (результаты аналогичны результатам where).
Во-вторых, краткое резюме появляется в разделе "Как взаимодействовать, группируя и где clauses" : -
Как взаимодействовать друг с другом, группировать и где
Когда вы включаете в запрос , группу и где, последовательность, в которой каждое предложение влияет на строки, определяет конечные результаты:
- Предложение where исключает строки, которые не соответствуют условиям поиска.
- Предложение group by собирает оставшиеся строки в одну группу для каждого уникального значения в выражении по выражению.
- Совокупные функции, указанные в списке выбора, вычисляют суммарные значения для каждой группы.
- Предложение с исключает строки из окончательных результатов, которые не соответствуют условиям поиска.
@SQLGuru поясняет это.
Изменить...
В связанной точке я был удивлен поведением не-ANSI-совместимых запросов, в которых используются расширенные столбцы TSQL. Sybase обрабатывает расширенные столбцы (i) после предложения WHERE (ii) путем создания дополнительных объединений к исходным таблицам и (iii) предложение WHERE не используется в соединении. Такие запросы могут возвращать больше строк, чем ожидалось, и предложение HAVING требует дополнительных условий для их фильтрации.
См. примеры b, c и d в разделе "Расширения Transact-SQL для группировки и наличия" на странице вашего исходного кода, связанных docco. Мне было полезно установить базу данных pubs2 из Sybase, чтобы играть вместе с примерами.