#std656¶
Ограничения на использование вложенных запросов в условии соединения¶
Не используйте вложенные запросы в условии соединения. Это может существенно замедлить запрос и в ряде случаев сделать его неработоспособным на отдельных СУБД.
Типовой проблемный сценарий: в условии соединения используется вложенный запрос, чтобы получить «срез последних» на конец предыдущего периода, причем для каждой номенклатуры период может отличаться.
Неправильно
ВЫБРАТЬ
ОстаткиТоваров.Номенклатура КАК Номенклатура,
Цены.Цена КАК ЦенаПрошлогоМесяца
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(...) КАК ОстаткиТоваров
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цена КАК Цены
ПО Цены.Номенклатура = ОстаткиТоваров.Номенклатура
И Цены.Период В (
ВЫБРАТЬ МАКСИМУМ(ЦеныПрошлогоМесяца.Период)
ИЗ РегистрСведений.Цена КАК ЦеныПрошлогоМесяца
ГДЕ ЦеныПрошлогоМесяца.Период < НАЧАЛОПЕРИОДА(ОстаткиТоваров.Период, МЕСЯЦ)
И ЦеныПрошлогоМесяца.Номенклатура = ОстаткиТоваров.Номенклатура
)
ГДЕ
ОстаткиТоваров.Склад = &Склад
Правильно
// Максимальные даты установки цен в прошлом периоде для данных номенклатур
ВЫБРАТЬ
ОстаткиТоваров.Номенклатура КАК Номенклатура,
МАКСИМУМ(Цены.Период) КАК Период
ПОМЕСТИТЬ ДатыПоНоменклатурам
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(..., Склад = &Склад) КАК ОстаткиТоваров
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цена КАК Цены
ПО Цены.Номенклатура = ОстаткиТоваров.Номенклатура
И Цены.Период < НАЧАЛОПЕРИОДА(ОстаткиТоваров.Период, МЕСЯЦ)
СГРУППИРОВАТЬ ПО
ОстаткиТоваров.Номенклатура
;
// Выбрать данные по цене за найденный период
ВЫБРАТЬ
ДатыПоНоменклатурам.Номенклатура КАК Номенклатура,
Цены.Цена КАК ЦенаПрошлогоМесяца
ИЗ
ДатыПоНоменклатурам
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цена КАК Цены
ПО Цены.Номенклатура = ДатыПоНоменклатурам.Номенклатура
И Цены.Период = ДатыПоНоменклатурам.Период
Рекомендуемый подход - вынести вычисления во временную таблицу и затем соединять уже готовый результат. Так запрос обычно работает стабильнее и предсказуемее.
См. также¶
- #std655: Ограничения на соединения с вложенными запросами и виртуальными таблицами
- #std777: Использование временных таблиц