При создании запросов мы часто используем временные таблицы. Недавно столкнулся с тем что запрос в СКД не совсем корректно отрабатывал.
Рассмотрим пакетный запрос:
ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.Пол
ПОМЕСТИТЬ ВТ
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ИНДЕКСИРОВАТЬ ПО
Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.Пол КАК Пол,
isnull(ВложенныйЗапрос.Количество,0) КАК Количество
{ВЫБРАТЬ
Ссылка.*,
Пол.*,
Количество}
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
КОЛИЧЕСТВО(ВТ.Ссылка) КАК Количество
ИЗ
ВТ КАК ВТ) КАК ВложенныйЗапрос
ПО (ИСТИНА)
{ГДЕ
ФизическиеЛица.Ссылка.*,
ФизическиеЛица.Пол.*,
ФизическиеЛица.ИНН}
Запрос особой смысловой нагрузки не несет, но думаю суть будет понятна. Мы хотим видеть в каждой строчке количество физ лиц всего.
Когда мы не накладываем никаких отборов, то все работает замечательно(рис.1).
Рис.1
Но если нам захочется добавить отбор по сотруднику или по полу
Рис.2
То получится не совсем то что мы ожидаем. В поле «Количество» получаем 4, хотя по идее там должно быть 48(рис.3) , т.к. отбор мы осуществляем в последней таблице.
Разберемся почему такое происходит. Перед формированием отчета наш запрос автоматически оптимизируется средствами СКД что как мы видели может привести к неожиданным результатам. Рассмотрим запрос, который получился после обработки СКД:
ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
ФизическиеЛица.Пол = &П
И ФизическиеЛица.Ссылка = &П
ИНДЕКСИРОВАТЬ ПО
Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.Пол КАК Пол,
isnull(ВложенныйЗапрос.Количество,0) КАК Количество,
ФизическиеЛица.Представление КАК СсылкаПредставление
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
КОЛИЧЕСТВО(ВТ.Ссылка) КАК Количество
ИЗ
ВТ КАК ВТ) КАК ВложенныйЗапрос
ПО (ИСТИНА)
ГДЕ
ФизическиеЛица.Пол = &П
И ФизическиеЛица.Ссылка = &П
рис.4
рис.5
После проделанных манипуляций формируем отчет и получаем нужный нам результат.
рис.6