В конфе есть справочник товаров и подчинённый ему справочник партий. У партии реквизит накладная - ссылка на документ.приходная, которой она создалась. "Новинки" за период - те товары, у которых дата накладной, создавшей первую партию, входит в заданный диапазон. Написал запрос, чтобы их вытаскивать, но работает не так быстро, как хотелось бы (хоть и быстрее оригинальной обработки раза в два
)
|SELECT
|tov.CODE Код,
|$tov.ISBN ISBN,
|$tov.Автор Автор,
|tov.DESCR Наименование,
|izd.DESCR Издательство,
|SUM($r.Остаток) Остат,
|$tov.Цена Цена
|FROM ( SELECT
| sel.tov,
| MIN(prt.CODE) code
| FROM ( SELECT
| $docs.Товар tov
| FROM _1SJourn j (NoLock)
| inner join $Документ.Приходная doc (NoLock) on doc.iddoc = j.iddoc
| AND $doc.Получатель = :ВыбСклад
| inner join $ДокументСтроки.Приходная docs (NoLock) on docs.iddoc = j.iddoc
| WHERE
| j.Date_time_iddoc BETWEEN :НачДата AND :КонДата~
| AND j.Closed&1=1
| GROUP BY $docs.Товар ) as sel
|
| left join $Справочник.Партии prt (NoLock) on prt.PARENTEXT = sel.tov
| AND prt.ISMARK = 0 AND $prt.Накладная <> $ПустойИД
| GROUP BY sel.tov ) as sel1
|
| inner join $Справочник.Товары tov (NoLock) on tov.id = sel1.tov
| inner join $Справочник.Партии prt (NoLock) on prt.code = sel1.code
| inner join _1SJourn j (NoLock) on j.iddoc = $prt.Накладная AND j.Date_time_iddoc > :НачДата
| left join $Справочник.Издательства izd (NoLock) on izd.id = $tov.Издательство
| left join $РегистрИтоги.Остатки r (NoLock)
| on r.PERIOD = '"+стрдатыТА+"' AND $r.Товар = sel1.tov AND $r.Склад = :ВыбСклад
|
|GROUP BY tov.CODE, $tov.ISBN, $tov.Автор, tov.DESCR, izd.DESCR, $tov.Цена
|ORDER BY tov.Descr";
Алгоритм такой:
1. Выбираем товар из приходных за период
2. Выдергиваем код минимальной партии для каждого товара
3. Смотрим поле "Накладная" у партий и Join'ами убираем товар, который не попадает в заданный период
Для 10 000 с небольшим элементов работает полторы-две минуты. Отдельно делал подзапросы, бОльшая часть времени тратится на поиск минимальной партии.
Пожалуйста, помогите оптимизировать алгоритм. Нужно переписать первый подзапрос, искать минимальную партию и Join'ить _1SJourn с условием по дате. Сам пробовал, но не получилось.