|
Условие в запросе к левой таблице | ☑ | ||
---|---|---|---|---|
0
Jonny_Khomich
05.04.22
✎
12:52
|
Добрый день.
Есть две таблицы, между ними левое соединение. Надо к левой таблице добавить условие. Как я думаю, можно условие добавить в двух местах 1) условие соединения Таблица1 Т1 Левое Соединение Таблица2 Т2 По Т1.Поле1 = Т2.Поле1 И Т1.Поле2 = &Параметр1 2) в разделе ГДЕ Таблица1 Т1 Левое Соединение Таблица2 Т2 По Т1.Поле1 = Т2.Поле1 Где Т1.Поле2 = &Параметр1 Если я добавляю в условие соединения, то оно не работает. Почему? |
|||
1
Said_We
05.04.22
✎
12:53
|
(0) Если условие необходимо применить к левой таблице, то это необходимо делать в подзапросе до соединения.
|
|||
2
shuhard
05.04.22
✎
12:54
|
(1) +1 или во временной табличке
|
|||
3
zippygrill
05.04.22
✎
12:54
|
потому что такой принцип работы запросов,.не только 1с, но и скулевые вроде.
На закладке Условия - считай что фильтр поставил, на закладке Условие соединения - считай что из таблицы B получишь записи только по условию связи |
|||
4
Jonny_Khomich
05.04.22
✎
12:57
|
(3) Я же могу наложить условие на правую таблицу в условиях соединения. Чем отличается левая от правой?
|
|||
5
Said_We
05.04.22
✎
12:58
|
(2) + Собственно как и для правой.
Т.е. Если для таблиц Т1 и Т2 есть условие вида Т1.Поле2 = &Параметр1 или условие вида Т2.Поле2 = &Параметр1 То их точно не должно быть в соединении. Таблиц "режут" до соединения. Быстрее работает. |
|||
6
Ненавижу 1С
гуру
05.04.22
✎
13:02
|
(4) левое соединение всегда выводить всю левую таблицу, не надо ничего ломать
|
|||
7
Jonny_Khomich
05.04.22
✎
13:04
|
(6) Есть какая-нибудь статья об этом? Хочется почитать. Я считал, что в условиях соединения могу отбирать данные как в левой, так и в правой таблице.
|
|||
8
Kassern
05.04.22
✎
13:06
|
(5) а это в какой-то методичке 1с написано, что подобным образом нельзя соединять таблицы?
Про оптимальность: Давайте возьмем левую таблицу имеющую 10 номенклатур к примеру. В базе может быть несколько лямов позиций номенклатур. А теперь давайте получим какой-нибудь доп реквизит из ТЧ номенклатуры, но нужно отобрать по свойству. Вы предлагаете вначале получить табличку ТЧ всех номенклатур по выбранному свойству, добавить во временную таблицу, а потом ее соединить с Таблицей 10 номенклатур? Это будет действительно быстрее, чем в соединении прописать отбор по свойству сразу? Я всегда думал, что по левой таблице обрежется правая, а потом только отработает условие во свойству. |
|||
9
Said_We
05.04.22
✎
13:06
|
(4) Ничем не отличается левое соединение от правого по сути. Любое левое можно написать как правое, но таблицы зеркально поменять.
Если поменять таблицы местами и написать правое, то будет тоже самое. (7) Сделай проще. Возьми консоль запросов простые данные и поэкспериментируй. |
|||
10
Said_We
05.04.22
✎
13:08
|
(8) "Давайте возьмем левую таблицу имеющую 10 номенклатур к примеру...
Вы предлагаете вначале получить табличку ТЧ всех номенклатур по выбранному свойству" - Если номенклатур всего 10, то зачем брать свойства для всех номенклатур? Берите сразу только для ваших 10. |
|||
11
Kassern
05.04.22
✎
13:10
|
(10) прост я не замечал хоть каких-то просадок в запросах, когда подобным образом соединял таблицы с условием в соединении.
|
|||
12
Said_We
05.04.22
✎
13:11
|
(8) Более того чтобы брать свойства соединение вообще не нужно.
|
|||
13
H A D G E H O G s
05.04.22
✎
13:12
|
(8) (11) MS SQL сервер умный. Он эти вещи умеет делать оптимально
|
|||
14
Kassern
05.04.22
✎
13:13
|
(13) я про то же подумал, что план запроса норм выстраивает и режет правую таблицу. Гляну как-нибудь на досуге в скуле
|
|||
15
Said_We
05.04.22
✎
13:22
|
(13) Умный, но бывает, что не всегда умный и бывает что не всегда МС СКЛ, и разных версий он тоже бывает, а есть ещё Постгри, который по другому умный.
Проще написать так, что бы не приходилось им сильно оптимизировать и не давать шансов быть не сильно умными. В случае переезда базы на другой сервер проблем меньше. |
|||
16
Said_We
05.04.22
✎
13:28
|
(13) Да и обсуждали уже много раз. Кто участвовал в данной ветке отметились и в ветке ниже.
Как правильно составить условие запроса? |
|||
17
Kassern
05.04.22
✎
14:22
|
(16) ради интереса нашел ваш пост с примером объединения Запрос по характеристикам
И протестил на доп реквизитах номенклатуры ваш метод и обычное условие в соединении: Вот что имеем в консоли запросов: 1) Ваш вариант переделанный на ТЧ номенклатуры (время выполнения 0.213с): ВЫБРАТЬ т.Ссылка КАК Ссылка, МАКСИМУМ(т.ФормаВыпуска) КАК ФормаВыпуска, МАКСИМУМ(т.Аналог) КАК Аналог ИЗ (ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка, NULL КАК ФормаВыпуска, NULL КАК Аналог ИЗ Справочник.Номенклатура КАК Номенклатура ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВЫРАЗИТЬ(ДополнительныеРеквизиты.Ссылка КАК Справочник.Номенклатура), ВЫБОР КОГДА ДополнительныеРеквизиты.Свойство = &ФормаВыпуска ТОГДА ДополнительныеРеквизиты.Значение ИНАЧЕ NULL КОНЕЦ, ВЫБОР КОГДА ДополнительныеРеквизиты.Свойство = &Аналог ТОГДА ДополнительныеРеквизиты.Значение ИНАЧЕ NULL КОНЕЦ ИЗ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты ГДЕ ДополнительныеРеквизиты.Свойство В (&ФормаВыпуска, &Аналог)) КАК т СГРУППИРОВАТЬ ПО т.Ссылка 2) Мой вариант через условие в соединении (время выполнения 0.116с): ВЫБРАТЬ Товары.Ссылка КАК Ссылка, НоменклатураАналог.Значение КАК Аналог, НоменклатураФормаВыпуска.Значение КАК ФормаВыпуска ИЗ Справочник.Номенклатура КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураАналог ПО (Товары.Ссылка = НоменклатураАналог.Ссылка И НоменклатураАналог.Свойство = &Аналог) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураФормаВыпуска ПО (Товары.Ссылка = НоменклатураФормаВыпуска.Ссылка И НоменклатураАналог.Свойство = &ФормаВыпуска) |
|||
18
Kassern
05.04.22
✎
14:24
|
По мне так 2 вариант куда лучше читается и проще такой запрос дорабатывать. Не нужно избавляться от дублей строк при помощи МАКСИМУМ()
|
|||
19
Said_We
05.04.22
✎
14:59
|
(18) Скорее всего данных мало. В ветке которую вы приводите в (17), автор получил практически десятикратное увеличение скорости.
|
|||
20
Kassern
05.04.22
✎
15:21
|
(19) в моем случае примерно 20тыс позиций номенклатуры, а в ТЧ доп. свойств номенклатуры может быть до 34 свойств.
"автор получил практически десятикратное увеличение скорости" - конечно получил, потому что он ранее брал всю таблицу со 100500 свойствами по всем объектам с отбором по свойству и пихал во временную таблицу и так по каждому свойсвту. Потом все эти временные таблицы цеплял основной таблице левым соединением. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |