Подскажите пожалуйста как правильнее делать соединения
СправочникАналогов LEFT JOIN СправочникТоваров LEFT JOIN РегистрПартии
Делаю так:
По СтрокаПоиска ищу различные КодАналогов из Спр.Аналоги
затем левым соединением присоединяю Спр.Номенклатура
затем левым соединением присоединяю Рег.ПартииТоваров.
Запрос рабочий.
Но кажется мне что не оптимальный. т.к. перед левым соединением
расчитывается Регистр.ПартииТоваров по всем товарам.
Как мне ограничить расчет Регистр.ПартииТоваров только теми товарами которые получаю после левого соединения с Справочником номенклатура?
ТекстЗапроса = "
|SELECT
| DISTINCT $СпрАналоги.КодАналогов AS КодАналогов,
| СпрНоменклатура.ID AS [Ссылка $Справочник.Номенклатура],
| СпрНоменклатура.Code AS Код,
| СпрНоменклатура.DESCR AS Наименование,
| ИтогиПартииТоваров.ОстатокТовара AS Остаток,
| CAST(ИтогиПартииТоваров.Стоимость AS NUMERIC(15,2)) AS Стоимость,
| CAST(ИтогиПартииТоваров.НДС AS NUMERIC(15,2)) AS НДС
|FROM
| $Справочник.Аналоги AS СпрАналоги
|LEFT JOIN $Справочник.Номенклатура AS СпрНоменклатура
| ON ($СпрНоменклатура.КодАналогов = $СпрАналоги.КодАналогов) AND
| (СпрНоменклатура.IsFolder = 2) AND
| (СпрНоменклатура.IsMark = '')
|LEFT JOIN (
| SELECT
| $ИтогиПартии.Товар AS ТоварID,
| SUM($ИтогиПартии.ОстатокТовара) AS ОстатокТовара,
| SUM($ИтогиПартии.Стоимость) AS Стоимость,
| SUM($ИтогиПартии.НДС) AS НДС
| FROM
| $РегистрИтоги.ПартииТоваров AS ИтогиПартии
| WHERE
| (period = :ТАМесяц~~)
| GROUP BY
| $ИтогиПартии.Товар
| ) AS ИтогиПартииТоваров
| ON ИтогиПартииТоваров.ТоварID = СпрНоменклатура.ID
|
|WHERE
| СпрАналоги.IsMark = '' AND
| (LOWER($СпрАналоги.Артикул) = :Артикул)
|";
База = СоздатьОбъект("OLEDBData");
Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
Рез = База.Соединение(Соединение);
Если Рез=0 Тогда
Сообщить("Подключение к БД не выполнено!", "!");
КонецЕсли;
Запрос = База.СоздатьКоманду();
Запрос.УстановитьТекстовыйПараметр("Артикул", СтрокаПоиска);
Запрос.УстановитьТекстовыйПараметр("ТАМесяц", НачМесяца(ПолучитьДатуТА()));
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);