Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 По BOL'y HAVING = WHERE?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Добрый день.

В статье, описывающей оператор HAVING
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/55650709-001e-42f4-902f-ead09a3c34af.htm

говорится, что
Specifies a search condition for a group or an aggregate. HAVING can be used only with the SELECT statement. HAVING is typically used in a GROUP BY clause. When GROUP BY is not used, HAVING behaves like a WHERE clause. 


Т.е., если не указывать GROUP BY, то HAVING работает как WHERE? Экспериментально подтвердить не удалось

select 	DayDate
from 	Daily
having 	DayDate > 39999

выдаёт ошибку
Column 'Daily.DayDate' is invalid in the HAVING clause because it is not contained in an aggregate function and there is no GROUP BY clause.

А как же тогда интерпретировать написанное в БОЛ?
13 окт 09, 19:38    [7781108]     Ответить | Цитировать Сообщить модератору
 Re: По BOL'y HAVING = WHERE?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
HAVING = WHERE для УЖЕ сгрупперованных данных
13 окт 09, 19:41    [7781120]     Ответить | Цитировать Сообщить модератору
 Re: По BOL'y HAVING = WHERE?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Timid

говорится, что
Specifies a search condition for a group or an aggregate. HAVING can be used only with the SELECT statement. HAVING is typically used in a GROUP BY clause. When GROUP BY is not used, HAVING behaves like a WHERE clause.

ну дык написанож
13 окт 09, 19:43    [7781124]     Ответить | Цитировать Сообщить модератору
 Re: По BOL'y HAVING = WHERE?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
select xtype, count(*) col 
from sysobjects group by xtype
having count(*)>100

равносильно:

select * from
(
select xtype, count(*) col 
from sysobjects group by xtype
) t
where col>100


Картинка с другого сайта.
13 окт 09, 19:45    [7781129]     Ответить | Цитировать Сообщить модератору
 Re: По BOL'y HAVING = WHERE?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
When GROUP BY is not used, HAVING behaves like a WHERE clause 

Вот что сбило меня с толку
13 окт 09, 20:13    [7781214]     Ответить | Цитировать Сообщить модератору
 Re: По BOL'y HAVING = WHERE?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timid,

означает это примерно следующее:
select max(field1) from Table
having count(*) >= 100

вернет вам максимальное значение fiild1 при условии что в таблице больше 100 строк.
13 окт 09, 20:52    [7781320]     Ответить | Цитировать Сообщить модератору
 Re: По BOL'y HAVING = WHERE?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
iljy
Timid,

означает это примерно следующее:
select max(field1) from Table
having count(*) >= 100

вернет вам максимальное значение fiild1 при условии что в таблице больше 100 строк.


Понял, спасибо!
14 окт 09, 12:11    [7783674]     Ответить | Цитировать Сообщить модератору
 Re: По BOL'y HAVING = WHERE?  [new]
aleks2
Guest
Knyazev Alexey
select xtype, count(*) col 
from sysobjects group by xtype
having count(*)>100

равносильно:

select * from
(
select xtype, count(*) col 
from sysobjects group by xtype
) t
where col>100


Картинка с другого сайта.

Чисто теоретически это необязательно эквивалентные запросы.
Гипотетически
having count(*)>100
может вести себя подобно exists(...), т.е. НЕ СЧИТАТЬ все группируемые записи, а только до ста.
14 окт 09, 14:05    [7784735]     Ответить | Цитировать Сообщить модератору
 Re: По BOL'y HAVING = WHERE?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
aleks2
Knyazev Alexey
select xtype, count(*) col 
from sysobjects group by xtype
having count(*)>100

равносильно:

select * from
(
select xtype, count(*) col 
from sysobjects group by xtype
) t
where col>100


Картинка с другого сайта.

Чисто теоретически это необязательно эквивалентные запросы.
Гипотетически
having count(*)>100
может вести себя подобно exists(...), т.е. НЕ СЧИТАТЬ все группируемые записи, а только до ста.

согласен, но для наглядности и понимания мой примерчик самое то
14 окт 09, 14:15    [7784821]     Ответить | Цитировать Сообщить модератору
 Re: По BOL'y HAVING = WHERE?  [new]
iljy
Member

Откуда:
Сообщений: 8711
aleks2
[quot Knyazev Alexey]
select xtype, count(*) col 
from sysobjects group by xtype
having count(*)>100

равносильно:

select * from
(
select xtype, count(*) col 
from sysobjects group by xtype
) t
where col>100

Чисто теоретически это необязательно эквивалентные запросы.
Гипотетически
having count(*)>100
может вести себя подобно exists(...), т.е. НЕ СЧИТАТЬ все группируемые записи, а только до ста.

эээ... а как в таком случае у вас данные будут выводится??
select xtype, count(*) col 

или хотите сказать не в этом случае, а в каком-нибудь другом? Я могу представить только один - если в селекте совсем нет агрегатов либо используется MAX или MIN и поиск идет по индексу, в котором минимизируемое поле участвует. Но только что проверил - не происходит такого.
14 окт 09, 14:16    [7784828]     Ответить | Цитировать Сообщить модератору
 Re: По BOL'y HAVING = WHERE?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
aleks2
Чисто теоретически это необязательно эквивалентные запросы.
Гипотетически having count(*)>100 может вести себя подобно exists(...), т.е. НЕ СЧИТАТЬ все группируемые записи, а только до ста.
Гипотетически, они могут быть эквиваленты и после данного аргумента, т.е. и с WHERE СЧИТАТЬ только до ста. ;))
14 окт 09, 16:24    [7786034]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить