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

Откуда:
Сообщений: 1684
Какой из этих вариантов предпочтительнее и почему.

SELECT id 
FROM 
	Rep r
	LEFT JOIN Files af 
		ON af.id = r.FILENAME_ID
	LEFT JOIN Agent ab 
		ON ab.code = r.code_ID
	LEFT JOIN Age a 
		ON a.id = ab.id_agent
	LEFT JOIN Currency cr 
		ON cr.Name = r.CURRENCY 
WHERE 
	(CONVERT(varchar(8), af.OFFDATE, 112) between @start AND @end) AND 
	(af.IS_OFF = 1) AND 
	(NOT r.SUM IS NULL)

Или же

SELECT id 
FROM 
	Rep r
	LEFT JOIN Files af 
		ON af.id = r.FILENAME_ID
		AND (CONVERT(varchar(8), af.OFFDATE, 112) between @start AND @end)
		AND (af.IS_OFF = 1)
	LEFT JOIN Agent ab 
		ON ab.code = r.code_ID
	LEFT JOIN Age a 
		ON a.id = ab.id_agent
	LEFT JOIN Currency cr 
		ON (cr.Name = r.CURRENCY) 
		AND (NOT r.SUM IS NULL)

По сути ведь условия WHERE - это условия налагаемые на одну таблицу, а в джойнах - на связь между таблицами, поэтому вариант №1 - правильный.

Поправьте если не так.
26 сен 11, 07:55    [11334572]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Это два разных запроса. Предпочтительней тот, который вернет вам нужный вариант.
26 сен 11, 08:44    [11334604]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Антохин, что лучше - теплое или мягкое, и почему?

ЗЫ: Строка ниже плоха в обоих вариантах:
...
AND (CONVERT(varchar(8), af.OFFDATE, 112) between @start AND @end)
...
26 сен 11, 08:48    [11334613]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
Антохин
Member

Откуда:
Сообщений: 1684
Гавриленко Сергей Алексеевич,

Возвращается одинаковый.
А в чём особая разница?
Указал связи на таблицы, а затем наложил условия, что в этом плохого или не правильного?

kDnZP,

Фишка в том, что в таблице хранистя дата с временем, а передаются даты без времени.
И если передаём @strat = @end = 20110926, а af.OFFDATE = 20110926 01:00:00, то данная запись не попадает в результат выборки.
26 сен 11, 09:07    [11334664]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
Антохин
А в чём особая разница?
Указал связи на таблицы, а затем наложил условия, что в этом плохого или не правильного?

Неправильного тут то, что WHERE отфильтрует набор после LEFT JOIN. Т.е. отфильтрует и те записи, которым нет соотвествия. Зачем тогда нужен этот LEFT JOIN - непонятно
26 сен 11, 09:14    [11334685]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
LEFT JOIN Files af
отличается от
INNER JOIN Files af
тtv, что иногда может вернуться af.OFFDATE IS NULL.
Но чудовищное условие
(CONVERT(varchar(8), af.OFFDATE, 112) between @start AND @end)
отбрасывает эти отличия в топку, ибо NULL этому условию не удовлетворяет.
26 сен 11, 09:15    [11334687]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
Антохин
Фишка в том, что в таблице хранистя дата с временем, а передаются даты без времени.
И если передаём @strat = @end = 20110926, а af.OFFDATE = 20110926 01:00:00, то данная запись не попадает в результат выборки.

И что мешает сделать так
af.OFFDATE >= @start AND af.OFFDATE < DATEADD(dd, 1, @end) ?
26 сен 11, 09:18    [11334698]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
Антохин
Member

Откуда:
Сообщений: 1684
Glory
Антохин
Фишка в том, что в таблице хранистя дата с временем, а передаются даты без времени.
И если передаём @strat = @end = 20110926, а af.OFFDATE = 20110926 01:00:00, то данная запись не попадает в результат выборки.

И что мешает сделать так
af.OFFDATE >= @start AND af.OFFDATE < DATEADD(dd, 1, @end) ?

А обязательно ли вызывать функцию DATEADD, вместо того чтобы прсто прибавить единицу?
26 сен 11, 09:24    [11334726]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Антохин
Glory
пропущено...

И что мешает сделать так
af.OFFDATE >= @start AND af.OFFDATE < DATEADD(dd, 1, @end) ?

А обязательно ли вызывать функцию DATEADD, вместо того чтобы прсто прибавить единицу?
Необязательно.
Но более понятно для читающего текст запроса.
Сразу видно, сколько и чего добавляется к дате.
26 сен 11, 09:26    [11334739]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
Антохин
Member

Откуда:
Сообщений: 1684
iap
Антохин
пропущено...

А обязательно ли вызывать функцию DATEADD, вместо того чтобы прсто прибавить единицу?
Необязательно.
Но более понятно для читающего текст запроса.
Сразу видно, сколько и чего добавляется к дате.

Но этот вызов должен повлиять на производительность. прибавятся лишние секунды.
26 сен 11, 09:33    [11334767]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Антохин, этот вызов позволит вам использовать индексы если они есть, и в таком случае - ускорит запрос.
26 сен 11, 09:34    [11334771]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
Антохин
Но этот вызов должен повлиять на производительность. прибавятся лишние секунды.

За счет однаждый вычисленного DATEADD(dd, 1, @end) или за счет чего ?
26 сен 11, 09:36    [11334780]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
Антохин
Member

Откуда:
Сообщений: 1684
Glory
Антохин
Но этот вызов должен повлиять на производительность. прибавятся лишние секунды.

За счет однаждый вычисленного DATEADD(dd, 1, @end) или за счет чего ?

Ну хотя да, был не прав, признаю.
26 сен 11, 09:42    [11334797]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
Антохин
Member

Откуда:
Сообщений: 1684
Спасибо всем!
26 сен 11, 09:43    [11334799]     Ответить | Цитировать Сообщить модератору
 Re: WHERE + JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Антохин
iap
пропущено...
Необязательно.
Но более понятно для читающего текст запроса.
Сразу видно, сколько и чего добавляется к дате.

Но этот вызов должен повлиять на производительность. прибавятся лишние секунды.
А Вы точно знаете, как сервер прибавляет целую единицу к дате?
Мгновенно так - раз, и готово! За 0 наносекунд.

Мне кажется, что это просто разные записи для одних и тех же действий сервера.
Но с функцией абсолютно всем всё понятно без дополнительных разъяснений.
26 сен 11, 09:58    [11334852]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить