powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / HAVING и WHERE
3 сообщений из 3, страница 1 из 1
HAVING и WHERE
    #32000032
encyclop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, дорогие SQL'евцы!

Я тоже по чуть-чуть начинаю становиться вашим коллегой. Взял с sql.ru книжку "Understanding SQL", распечатал, читаю, уже на середине, но мне очень мешает моё одновременное непонимание некоторых принципиальных вещей. Никак не могу до конца понять, в чём принципиальное отличие HAVING от WHERE. Да, понимаю, что предикаты оцениваются в терминах одиночной строки (WHERE), а агрегатные функции оцениваются в терминах групп строк (HAVING). Но почему тогда, чёрт возьми, автор книги приводит пример неправильного запроса:

SELECT snum, odate, MAX (amt)
FROM Oreders
WHERE MAX ((amt)) > 3000.00
GROUP BY snum, odate;

и правильного:

SELECT snum, odate, MAX ((amt))
FROM Orders
GROUP BY snum, odate
HAVING MAX ((amt)) > 3000.00;

Думаешь, наконец-то понял. Ан нет, в дальнейшем окончательно начинает запутывать. Оказывается, ко всему ещё и такие запросы неверны:

SELECT snum, MAX (amt)
FROM Orders
GROUP BY snum
HAVING odate = 10/03/1988;

И это потому, что поле оdate не может быть вызвано предложением HAVING, потому что оно может иметь (и действительно имеет) больше чем одно значение на группу вывода.
Допустим, тогда почему этот пример, напротив, верен? (см. ниже)


SELECT snum, MAX (amt)
FROM Orders
GROUP BY snum
HAVING snum B (1002,1007);

А здесь тогда что ??? Одно значение на группу вывода? Или это у меня в глазах двоится?

Помогите, пожалуйста!!!
...
Рейтинг: 0 / 0
HAVING и WHERE
    #32000033
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если HAVING snum IN (1002,1007) то все верно. Неважно сколько snum отберет HAVING - все сгруппировано по snum и запрос остается корректным.
...
Рейтинг: 0 / 0
HAVING и WHERE
    #32000034
wlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запомни одну очень простую вещь - HAVING отсеивает уже после того как выполнился SELECT, а WHERE в момент выполнения запроса. Очевидно 1 запрос неверен так как приходится сначала найти максимум, а затем уже отсекать конечный результат - что и показано во 2 и 4 примерах. Аналогично в третьем примере - конечный результат SELECT не содержит поля odate.
Вот так - без огромного количества заумных слов!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / HAVING и WHERE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]