Имя: Пароль:
1C
1С v8
Левое соединение с условием
0 PiotrLoginov
 
26.05.14
20:33
Здравствуйте всем. Может туплю под конец понедельника... открыл чужую обработку. Читаю запрос:

ВЫБРАТЬ
        |    РеализацияТоваровУслуг.Ссылка КАК Документ,
        |    ВЫБОР
        |        КОГДА РеализацияТоваровУслуг.АдресДоставки <> """"
        |            ТОГДА РеализацияТоваровУслуг.АдресДоставки
        |        ИНАЧЕ КонтактнаяИнформация.Представление
        |    КОНЕЦ КАК Адрес,
        |ИЗ
        |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        |        ПО РеализацияТоваровУслуг.Контрагент = КонтактнаяИнформация.Объект
        |ГДЕ
        |    КонтактнаяИнформация.Вид = &ВидКонтактнойИнформации
        |    И РеализацияТоваровУслуг.Дата МЕЖДУ &Начало И &Конец

ВидКонтактнойИнформации - это Справочники.ВидыКонтактнойИнформации.АдресДоставкиКонтрагента
Начало и Конец, понятно, дата начала периода, за который отбираем РТиУ и его конца

Так вот, документы, для контрагентов которых в РС "КонтактнаяИнформация" данных нету, в результат запроса не попадут.

Вообще, когда мы выбираем ВСЕ данные Икс из справочника1, а также левым соединением согласно связи Зэт - данные Игрек из справочника2 (но не все, а только соответствующие определенному условию), то вполне возможно, если для очередного Икс нет подходящих строк в справочнике2 (соответствующих связи Зэт и определенному нами условию), Икс будет отсеян и не попадет в результат запроса. Несмотря на то, что соединение ЛЕВОЕ, т.е. по идее мы должны получить ВСЕ Икс из справочника1.

Такое впечатление, да так оно вроде бы и есть, что сначала формируется таблица выборки из обеих таблиц, а затем уже к ней начинают применяться условия, определенные после слова ГДЕ. Так что, как писал уважаемый форумчанин здесь: v8: ЛЕВОЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ по условию , "ЛЕВОЕ с правильным отбором даст результат аналогичный ВНУТРЕННЕМУ".

Позвольте спросить: как правильно написать приведенный выше запрос, чтобы быть уверенным, что ни одно РТиУ не будет пропущено, даже если его контрагент не имеет в контактных данных никаких записей. Просто я могу подправить этот запрос самыми разными способами. Интересует оптимальный.
1 shuhard
 
26.05.14
20:34
(0) в 100500 раз
- подзапрос
- ВТ
- условие в ПО
2 PiotrLoginov
 
26.05.14
20:36
ага. все-таки приоритет скорости у временных таблиц.  понял, спасибо
3 NcSteel
 
26.05.14
20:38
(2) ВТ тут никчему.

Просто перенести условие из ГДЕ в условие соединений.
4 shuhard
 
26.05.14
20:41
(3)  заметь, я тут не при чем =)
5 PiotrLoginov
 
26.05.14
20:56
(3) Так:


ВЫБРАТЬ
        |    РеализацияТоваровУслуг.Ссылка КАК Документ,
        |    ВЫБОР
        |        КОГДА РеализацияТоваровУслуг.АдресДоставки <> """"
        |            ТОГДА РеализацияТоваровУслуг.АдресДоставки
        |        ИНАЧЕ КонтактнаяИнформация.Представление
        |    КОНЕЦ КАК Адрес,
        |ИЗ
        |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        |        ПО РеализацияТоваровУслуг.Контрагент = КонтактнаяИнформация.Объект
        |            И (КонтактнаяИнформация.Вид = &ВидКонтактнойИнформации)
        |ГДЕ
        |    РеализацияТоваровУслуг.Дата МЕЖДУ &Начало И &Конец

?   так работает.  И это оптимальнейший путь ?  ну вот.  побоку условия, даешь теперь их перенос в связи
6 PiotrLoginov
 
26.05.14
20:57
запятую только после "Адрес" убрать
7 PiotrLoginov
 
26.05.14
21:09
(1) теперь понял, что означало "условие в ПО"