![]() |
![]() |
![]() |
|
Левое соединение с условием | ☑ | ||
---|---|---|---|---|
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) теперь понял, что означало "условие в ПО"
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |