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


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