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

Откуда:
Сообщений: 930
Всем добрый день. Есть такой запрос:
select
	1
from
			   dbo.UT_CommoditiesQualifiers as CQ
	inner join dbo.UT_QualifiersReportElements as QRE
			on QRE.id_Qualifier = CQ.id_Qualifier
	inner join dbo.UT_ReportElements as RE
			on RE.id_ReportElement = QRE.id_ReportElement
	inner join dbo.UT_Reports as R
			on R.id_Report = RE.id_Report
where
	CQ.id_Commodity = @id_Commodity and
	R.RCRelationTypes > 0
group by
	 R.RCRelationTypes
	 ,RE.id_Report
having
	...
Не понимаю как написать секцию having так, чтобы при R.RCRelationTypes = 1 в ней был фильтр по COUNT(*) <> 1, а при R.RCRelationTypes = 2 COUNT(*) > 2
18 сен 12, 12:37    [13181532]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Читатель неместный
Guest
having R.RCRelationTypes = 1 and COUNT(*) <> 1
or R.RCRelationTypes = 2 and COUNT(*) > 2
18 сен 12, 12:40    [13181566]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Читатель неместный
having R.RCRelationTypes = 1 and COUNT(*) <> 1
or R.RCRelationTypes = 2 and COUNT(*) > 2
Ну конечно! Надо все-таки высыпаться )) Спс
18 сен 12, 12:42    [13181604]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
rsolanov,

если надо, чтобы R.RCRelationTypes принимал только значения 1 или 2,
то почему в WHERE стоит R.RCRelationTypes > 0 ???
Может, лучше R.RCRelationTypes IN(1,2) ?
18 сен 12, 12:51    [13181713]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
having SUM(CASE WHEN R.RCRelationTypes=1 THEN 1 END) <> 0 or SUM(CASE WHEN R.RCRelationTypes=2 THEN 1 END) > 2
18 сен 12, 12:54    [13181743]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
rsolanov
Member

Откуда:
Сообщений: 930
iap
rsolanov,

если надо, чтобы R.RCRelationTypes принимал только значения 1 или 2,
то почему в WHERE стоит R.RCRelationTypes > 0 ???
Может, лучше R.RCRelationTypes IN(1,2) ?
Сейчас стоит ограничение по значению от 0 до 2 включительно, поэтому думаю так тоже хорошо.
18 сен 12, 13:00    [13181792]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
rsolanov
iap
rsolanov,

если надо, чтобы R.RCRelationTypes принимал только значения 1 или 2,
то почему в WHERE стоит R.RCRelationTypes > 0 ???
Может, лучше R.RCRelationTypes IN(1,2) ?
Сейчас стоит ограничение по значению от 0 до 2 включительно, поэтому думаю так тоже хорошо.
Если рассуждать логически, то сначала выбираются все данные, удовлетворяющие WHERE,
а потом из них выбрасываются неудовлетворяющие HAVING.
Из этих соображений хорошо бы изначально отбирать поменьше с помощью более точного критерия в WHERE.

Подозреваю, что сервер не дурак, и может сам разобраться в данном случае.
Но в реальных сколько-нибудь больших запросах всякое может быть...
18 сен 12, 13:19    [13181967]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Glory
having SUM(CASE WHEN R.RCRelationTypes=1 THEN 1 END) <> 0 or SUM(CASE WHEN R.RCRelationTypes=2 THEN 1 END) > 2
Хотя план запроса по сравнению с R.RCRelationTypes = 1 and COUNT(*) <> 1 or R.RCRelationTypes = 2 and COUNT(*) > 2 практически одинаковый (стоимость вашего 0,0313789 против другого с 0,313805), надо сказать написано очень изящно, возьму на вооружение! Спасибо ))
18 сен 12, 13:34    [13182104]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить