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

Откуда: Минск
Сообщений: 407
Создавал уже похожую тему, однако ситуация изменилась.
Есть две таблицы:
[Bids](заявки) - колонки [Индекс заявки], [Дата]
[BidsInDetails](товары к заявкам) - колонки [Индекс], [Заявка](связана с [Bids].[Индекс заявки]), [Код товара],[Количество]

Нужно зная [BidsInDetails].[Код товара] и [Bids].[Дата] получить сумму sum([BidsInDetails].[Количество])

Вот фрагмент реального запроса:
left outer join [BidsInDetails] on [BidsInDetails].[Код товара] = "код который заведомо знаю"
left outer join [Bids] on [Bids].[Индекс заявки] = [BidsInDetails].[Заявка] and [Bids].[Дата] >= "дата которую заведомо знаю"

Естественно если так оставлять то сумму считает не верно.
Помогите пожалуйста.Спасибо
12 дек 13, 18:47    [15284409]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ч.2  [new]
Virtuoz
Member

Откуда: Украина
Сообщений: 307
Че та я не пойму, а в чем проблема то?...

select [BidsInDetails].[Код товара], [Bids].[Дата], sum([BidsInDetails].[Количество])
from [Bids]
 join [BidsInDetails] on [Bids].[Индекс заявки] = [BidsInDetails].[Индекс заявки]
where  [BidsInDetails].[Код товара] = "код который заведомо знаю" and [Bids].[Дата] >= "дата которую заведомо знаю"
group by [BidsInDetails].[Код товара], [Bids].[Дата]


Условия отбора в join-ах лучше не указывать. Только в where.
12 дек 13, 18:59    [15284461]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ч.2  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Virtuoz
Условия отбора в join-ах лучше не указывать. Только в where.
может в общем случае я и не прав, но из моей практики сложилось впечатление
что если есть хороший фильтр для приджойненой таблицы (сокращающий выбор до нескольких строк)
то лучше таки вписать его именно в джойн
как там оптимизатору в голову взбредет построить план я не знаю (часто бывает неплохо, хотя иногда и полная лажа получается)
но если в джойн вписать - то железно сначала применяет фильтр, а потом соединяет
"железно" конечно в кавычках, потому как по всякому бывает
понимаю что нагладность чуть теряется, но скорость важнее, потому иногда применяю
12 дек 13, 19:48    [15284643]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ч.2  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Оптимизатор соблюдает логический смысл запроса. Если это outer join, то логически есть разница где писать условие, если inner, то, с точки зрения оптимизатора, нет (хотя могут быть курьезы упрощения логического дерева, на что я когда-то натыкался).

Имхо, лучше писать так, чтобы было понятно людям, имеешь умысел на соединение по колонкам, пиши в join, имеешь умысел на фильтрацию после соединения пиши в where - оптимизатор умеет разбираться как ему лучше выполнять, и умеет делать фильтрацию раньше соединения и т.д.
12 дек 13, 19:57    [15284675]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ч.2  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
leov
Virtuoz
Условия отбора в join-ах лучше не указывать. Только в where.
может в общем случае я и не прав, но из моей практики сложилось впечатление
что если есть хороший фильтр для приджойненой таблицы (сокращающий выбор до нескольких строк)
то лучше таки вписать его именно в джойн
как там оптимизатору в голову взбредет построить план я не знаю (часто бывает неплохо, хотя иногда и полная лажа получается)
но если в джойн вписать - то железно сначала применяет фильтр, а потом соединяет
"железно" конечно в кавычках, потому как по всякому бывает
понимаю что нагладность чуть теряется, но скорость важнее, потому иногда применяю
В случае LEFT JOIN выбор у Вас совсем невелик
12 дек 13, 19:57    [15284676]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ч.2  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
leov
но если в джойн вписать - то железно сначала применяет фильтр, а потом соединяет
Разницы нет, куда писать, план запроса будет одинаковый.
Главное, что бы логика запроса не поменялась (например, в случае с left join).
12 дек 13, 23:26    [15285363]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить