1с что быстрее внутреннее соединение или левое

Что лучше использовать в данном примере ЛЕВОЕ или ВНУТРЕННЕЕ соединение

2. ВНУТРЕННЕЕ 100% (1)1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое
1. ЛЕВОЕ 0% (0)1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Всего мнений: 1

1 таблица содержит 10 000 строк.

Нужно получить записи из этой таблицы, которые есть в другой. Это логика внутреннего соединения.

Также эти записи можно получить и ЧЕРЕЗ Левое, потом наложив фильтр на пустое значение.

И возможны ли варианты когда лучше использовать ЛЕВОЕ а в другом случае ВНУТРЕНЕЕ, в зависимости от существенной разницы между таблицами.

Впиндюлил галку на форме которая меняет запрос. Протетить не могу нормально.

Надо будет проверить у клиентов у которых по 100-200 тысяч

Просто может быть ситуация что человек грузит накладную в ней 100 строк, а в базе 20 000.

Наверное тут даже без вопросов ЛЕВОЕ рулит.

КОроче сделаю галку с опцией если в базе 20-30 тысяч чтобы всегда было левое.
А если меньше внутренее

И допустим все эти 10 000 есть в базе. Те получается почти полное вхождение и особо даже сеять нечего.

В общем на эти и другие ответы надо делать замеры на разных базах в реальных условиях

пригласи уже специалиста или сам мануалы почитай.

+(13) одно и то же с точки зрения результата. С точки зрения производителельности внутреннее быстрее, т.к. при левом соединении сначала будет получено левое, а потом из него будут выброшены все записи по условию. А при внутреннем вот этой второй операции не будет.

Можно продолжать тыкать пальцем в небо, а можно научиться хотя бы пользоваться консолью запросов Tormozit’овской, которая план запроса показывает. Анализ планов запросов позволит на форуме ахинею не пороть и время не тратить.

А если вся таблица почти полностью есть в 1С т овнутреннее!!
Отлично.

(19) Там дело гораздо проще и удобдней реализована.

Поэтому все это отображается и так далее и тому подобное.

В общем я по опции реализовал. А там на реальных тестах затестим. У всех разные базы, разные ситуации.

У кого то просто 10к товаров, а кто то по 100к грузит.

И опять таки могут быть разные совершенно комбинации между размерами импорта и данными в 1С.

Плюсов у такого подхода больше, чем у первого или второго.

Источник

Левое соединение VS условие В

Есть 2 запроса, где условие на выбираемые документы сделано через левое соединение и через условие В. Левое соединение работает в несколько раз быстрее.
Вопрос такой: т.к. «В» более читабельное (особенно когда есть несколько подобных условий) то как реализовать условие В чтобы оно работало оптимально?

МЕДЛЕННЫЙ ЗАПРОС (несколько секунд):
ВЫБРАТЬ
Доверенность.ДокументРасчетов КАК Док
ПОМЕСТИТЬ ДокументыРасчетов
ИЗ
Документ.Доверенность.ДокументыРасчетов КАК Доверенность
ГДЕ
Доверенность.Ссылка = &ДокументСсылка
И ТИПЗНАЧЕНИЯ(Доверенность.ДокументРасчетов) = ТИП(Документ.Реализация)

ВЫБРАТЬ
Товары.Сумма
ИЗ
Документ.Реализация.Товары КАК Товары
ГДЕ
Товары.Ссылка В
(ВЫБРАТЬ
ДокументыРасчетов.Док
ИЗ
ДокументыРасчетов)

БЫСТРЫЙ ЗАПРОС (доли секунды):
ВЫБРАТЬ РАЗЛИЧНЫЕ
Доверенность.ДокументРасчетов КАК Док
ПОМЕСТИТЬ ДокументыРасчетов
ИЗ
Документ.Доверенность.ДокументыРасчетов КАК Доверенность
ГДЕ
Доверенность.Ссылка = &ДокументСсылка
И ТИПЗНАЧЕНИЯ(Доверенность.ДокументРасчетов) = ТИП(Документ.Реализация)

;
ВЫБРАТЬ
Товары.Сумма
ИЗ
ДокументыРасчетов КАК ДокументыРасчетов
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Реализация.Товары КАК Товары
ПО ДокументыРасчетов.Док = Товары.Ссылка

(0) В первом случае отбираются доверенности. Затем выбираются все реализации и доверенности, и только потом на них накладывается условие.
Во втором случае выбираются доверенности, затем происходит соединение таблиц без всяких условий, т.е. «отбор» идет на уровне соединения таблиц.

Плюс кошернее вместо
ТИПЗНАЧЕНИЯ(Доверенность.ДокументРасчетов) = ТИП(Документ.Реализация)
писать
Доверенность.ДокументРасчетов ССЫЛКА Документ.Реализация

Кстати, имхо соединение более читабельно, чем конструкция В

(3) почему считаешь, что условие накладывается потом? обычное условие же

Источник

Соединения в запросах 1С 8.3

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Перекрестное соединение таблиц

В качестве источника в запросах можно указать несколько разных таблиц. Если не указать никакие условия для связи таблиц, то будет получено декартово произведение (все возможные комбинации строк) или как еще называют перекрестное соединение.

Например, в базе есть 2 таблицы: ЛеваяТаблица и ПраваяТаблица. Состав таблиц следующий:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое 1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

В результате выполнения следующего запроса:

Будет получен такой результат:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Каждая запись из левой таблицы была связана с каждой записью из правой таблицы.

Виды соединений в запросе

Соединения нужны для того, чтобы соединить строки разных таблиц по какому-либо условию. Условия указываются после ключевого слова ПО. Может быть несколько условий при одном соединении.

Язык запросов 1С поддерживает следующие виды соединений:

В запросах позволяется не указывать слова внутреннее и внешнее.

Внутреннее соединение

В результате внутреннего соединения таблиц в выборку попадут только те записи, которые удовлетворяют условию соединения:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

В результат запроса не попала четвертая запись из левой таблицы, потому что для нее не нашлось записи в правой таблице, которая бы удовлетворяла условию ЛеваяТаблица.Код = ПраваяТаблица.Код.

Левое соединение

В результате левого соединения таблиц в выборку попадут все записи из левой таблицы, и только те записи из правой таблицы, которые удовлетворяют условию соединения:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

В четвертой строке в полях ПравоеНаименование и ПравыйКод будет NULL.

Правое соединение

Это то же самое, что и левое соединение, только таблицы меняются местами. В результате правого соединения таблиц в выборку попадут все записи из правой таблицы, и только те записи из левой таблицы, которые удовлетворяют условию соединения. Очень редко используется на практике:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

В четвертой строке в полях ЛевоеНаименование и ЛевыйКод будет NULL.

Полное соединение

В результате полного соединения таблиц в выборку попадут все записи из левой таблицы и все записи из правой таблицы. Где условие соединения будет выполнено — записи будут объединены. Где не будет выполнено будет NULL.

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

В четвертой строке в полях ЛевоеНаименование и ЛевыйКод будет NULL. В пятой строке в полях ПравоеНаименование и ПравыйКод будет NULL.

Два левых соединения в запросе

Допустим, что есть еще одна таблица со следующим содержимым:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

И нужно связать и ее и правую таблицу с левой. Для этого можно использовать два левых соединения:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Точно также можно связать и три таблицы, и четыре и т.д. То же самое относится и к внутреннему, правому и полному соединению.

Левое соединение с условием

Если при левом соединении наложить условие на поле правой таблицы, то соединение будет автоматически преобразовано во внутреннее соединение:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Казалось бы при левом соединении в результат запроса должны были попасть все записи из левой таблицы, но в результате только одна запись. Так происходит, потому что в строках с кодами «000000001», «000000003» и «000000004» в колонке ПравыйКод был получен NULL. После чего было выполнено сравнение значений данной колонки со значением «000000002». Сравнение с NULL всегда возвращает Ложь, поэтому такие записи не попали в результат запроса. На уровне СУБД оптимизатор запроса сразу отлавливает такие моменты и просто преобразует соединение во внутреннее.

Чтобы получить правильный результат нужно условие перенести из предложения ГДЕ в условие соединения:

Источник

1с что быстрее внутреннее соединение или левое

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: соединения

Автор уроков и преподаватель школы: Владимир Милькин

Соединения в запросах

Соединения используются для того, чтобы сопоставить строки одной таблицы строкам другой таблицы.

Для того, чтобы осознать необходимость соединений давайте решим следующую задачу.

У нас в базе есть справочник Клиенты:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

И справочник Ассоциации:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Наша задача вывести любимые ассоциации клиентов, основываясь на цвете.

Для Андрея вообще нет подходящей ассоциации, так его любимый цвет красный, а ассоциаций красного цвета в базе нет.

Будем решать задачу постепенно.

Сначала запросим всех клиентов и их любимые цвета :

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Затем запросим все ассоциации и их цвета :

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Теперь нам каким-то образом следует совместить первую и вторую таблицу. Чтобы это сделать запросим информацию сразу из двух таблиц. Для этого перечислим обе таблицы в секции ИЗ через запятую. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. А в секции ВЫБРАТЬ укажем поля из обеих таблиц:

Если мы попробуем выполнить этот запрос, то получим ошибку:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Причина ошибки в том, что поле Наименование присутствует сразу в обеих таблицах (Клиенты и Ассоциации) и система просто не знает поле из какой именно таблицы имеется в виду.

Чтобы устранять подобные неоднозначности при выборке из более чем одной таблицы принято указывать полные названия полей. Полное название поля включает в себя полное имя таблицы (например, Справочник.Клиенты) и имя самого поля (например, Наименование).

Таким образом полное название поля Наименование из таблицы Клиенты будет Справочник.Клиенты.Наименование.

А полное названия поля Наименование из таблицы Ассоциации будет Справочник.Ассоциации.Наименование.

Перекрёстное соединение

Перепишем предыдущий запрос с полными именами полей:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Только что мы произвели перекрёстное соединение двух таблиц. Обратите внимание на то, каким образом сформировался результат:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Внутреннее соединение

Очевидно, что результат перекрестного соединения двух таблиц не есть решение нашей задачи. Нам нужны не все записи из перекрёстного соединения, а только те у которых поля ЛюбимыйЦвет и Цвет имеют одинаковое значение:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Чтобы получить эти записи добавим к предыдущему запросу секцию ГДЕ:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Есть ещё один вариант написания того же самого внутреннего соединения :

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Сравните этот и предыдущий запрос. Они совершенно одинаковы с точки зрения платформы, просто имеют разный синтаксис. И этот и предыдущий запросы содержат внутреннее соединение таблицы Клиенты с таблицей Ассоциации по полям ЛюбимыйЦвет и Цвет соответственно.

Левое внешнее соединение

Обратите внимание на то, что в результат внутреннего соединения не попал Андрей. А всё потому, что его любимый цвет красный, а красных ассоциаций у нас в базе нет вовсе.

Получается, что для Андрея с его красным цветом просто не нашлось пары из таблицы ассоциаций.

Перепишем запрос так, чтобы в результат попадали в том числе те записи из первой таблицы, для которых не нашлось ни одной пары из второй таблицы (в данном случае Андрей):

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Такое соединение называется левым внешним соединением (слово внешнее можно опускать для простоты).

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Правое внешнее соединение

Но давайте снова вернёмся к внутреннему соединению:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Обратите внимание на то, что результат внутреннего соединения не содержит ассоциацию белый снег, так как не нашлось ни одного клиента, у которого любимым цветом был бы белый.

Перепишем запрос так, чтобы в результат попадали в том числе те записи из второй таблицы, для которых не нашлась ни одной пары из первой таблицы (в данном случае белый снег):

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Такое соединение называется правым внешним соединением (слово внешнее можно опускать для простоты).

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Полное соединение

А что если нам нужно, чтобы в результат запроса попадали помимо внутреннего соединения Андрей и Снег одновременно?

Для этого потребуется совместить результаты левого и правого соединений. Такой вид соединения уже придуман и называется полным соединением:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Результат полного соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из первой таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары) ПЛЮС все записи из второй таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары).

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Псевдонимы таблиц

Согласитесь, что все запросы, которые мы писали в этом уроке выглядят довольно громоздко. Это связано с тем, что мы вынуждены указывать полные имена полей, чтобы избежать возникновение неоднозначности.

А чтобы результат запроса был ещё нагляднее добавим псевдонимы полей, которые мы уже рассматривали на одном из прошлых уроков:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Обработка NULL

Присмотритесь к результатам последнего запроса (как впрочем и многих предыдущих на этом уроке).

Чему равны значения полей Ассоциация и ЕёЦвет для первой строчки? А что вы скажете насчет полей Клиент и ЕгоЦвет для последней строки?

Они равны NULL, которое как мы уже знаем означает отсутствие какого либо значения:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

Поэтому обязательной считается обработка значений NULL всегда, когда они могут возникнуть.

Под обработкой подразумевается то, что мы должны сказать в нашем запросе, что если одно из полей будет равно NULL, то в это поле следует подставить какое-то другое значение.

В данном случае для полей Клиент и Ассоциация в случае обнаружения NULL мы будем подставлять пустую строку «».

А вот поля ЕгоЦвет и ЕёЦвет являются ссылками на элементы справочника Цвета, поэтому в них можно подставлять только значения являющиеся ссылками указанных типов. Каждый ссылочный тип (например, Справочник или Документ) имеет предопределенный элемент ПустаяСсылка. Чтобы указать его значение в запросе воспользуемся функцией ЗНАЧЕНИЕ.

Для определения того, что в поле попало NULL будем использовать уже знакомую нам по прошлым урокам функцию ЕСТЬNULL:

1с что быстрее внутреннее соединение или левое. Смотреть фото 1с что быстрее внутреннее соединение или левое. Смотреть картинку 1с что быстрее внутреннее соединение или левое. Картинка про 1с что быстрее внутреннее соединение или левое. Фото 1с что быстрее внутреннее соединение или левое

С виду (из консоли запросов) результат не изменился. Мы по-прежнему видим пустые поля. Но это только потому, что строковые представления у NULL и у пустых полей всех типов совпадают и равны пустой строке.

На самом же деле эти пустые поля уже не есть NULL (отсутствие значения), теперь в них появились значения (пустые), с которыми уже можно работать (совершать операции).

Соединение более двух таблиц

Можно последовательно соединять сколько угодно таблиц.

Предположим нужно решить следующую задачу. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Вывести все возможные варианты клиентов и их любимых ассоциаций и их любимых продуктов исходя из их любимого цвета.

Для этого последовательно соединим по цвету таблицу Клиенты с таблицей Ассоциации, а затем (получившийся результат) с таблицей Еда:

Источник

Профессия — 1С

рубрики: Запросы | Дата: 31 января, 2016

В предыдущей статье был рассмотрен вопрос чем отличается соединение таблиц от объединения. А сейчас рассмотрим подробнее соединение таблиц.

Напомню, что видов соединений в языке запросов 1С8 может быть несколько, а именно: ЛЕВОЕ СОЕДИНЕНИЕ, ПРАВОЕ СОЕДИНЕНИЕ, ВНУТРЕННЕЕ СОЕДИНЕНИЕ, ПОЛНОЕ СОЕДИНЕНИЕ. Рассмотрим каждое из них подробно.

ЛЕВОЕ СОЕДИНЕНИЕ

В случае левого соединения данные из одной таблицы выбираются полностью, а из таблицы, которая присоединяется справа, выбираются только те записи для которых выполняется одно или несколько условий по которым эти таблицы соединяются. Из этого предложения конечно же мало, что можно понять, поэтому разберем пример.
Есть таблица «Товары»:

КодТовараНаименование
001Яблоки
002Апельсины
003Мандарины

Сформируем эту таблицу в консоли запросов 1С с помощью вот такого запроса:

А еще есть таблица «Страны» вот такого вида:

КодТовараСтрана
001Россия
002Турция
003Марокко

Также сконструируем ее запросом:

А теперь соединим эти две таблицы с помощью левого соединения, чтобы получить одну, в которой будет и код товара, и наименование, и страна. Для этого поместим наши таблицы во временные и в пакетном запросе выполним левое соединение.

Записи будем связывать конечно же по полям КодТовара

Можете скопировать этот код в консоль запросов и выполнив его получите вот такой результат:

КодТовараНаименованиеСтрана
001ЯблокиРоссия
002АпельсиныТурция
003МандариныМарокко

Здесь мы рассмотрели идеальную ситуацию, когда каждой записи в левой таблице соответствует одна запись в правой. Давайте немного усложним.

Допустим для нашего товара у нас есть еще цены. Причем они могут меняться в зависимости от даты:

КодТовараДатаЦена
00101.01.2016120
00101.02.2016150
00201.01.2016200
00401.01.2016350

Здесь мы видим, что для товара с кодом 001 (Яблоки) у нас 2 записи в таблице цен. Для мандаринов цена отсутствует. И кроме того в ценах есть код товара 004, которого нет в таблице с товарами. Давайте выполним левое соединение для товаров и цен с условием связи по полю код и посмотрим, что у нас получится.

После выполнения запроса видим вот такую картину:

КодТовараНаименованиеЦенаДата
001Яблоки12001.01.2016
001Яблоки15001.02.2016
002Апельсины20001.01.2016
003МандариныNULLNULL

Проанализируем полученный результат. Из таблицы «Товары» были выбраны все записи, т.к. она у нас основная. Для мандаринов цена имеет значение NULL, т.к. записи с кодом 003 нет в таблице с ценами. А запись с кодом 004 из таблицы цен (а она у нас вспомогательная) была проигнорирована, т.к. для нее нет соответствия в таблице товаров. И как мы видим у нас появилось 2 записи с яблоками несмотря на то, что в таблице товаров запись с кодом 001 одна. В этом и заключается некоторое коварство соединений таблиц.

И на эти грабли наступают как начинающие, так и опытные программисты. Когда запись в основной таблице одна, а в присоединяемой несколько записей удовлетворяют условию соединения, то в итоговой таблице количество записей будет равно количеству записей во вспомогательной таблице. В нашем случае произошло задвоение записи с яблоками. Этот момент надо обязательно учитывать при написании запросов и проверять при тестировании.

    ПРАВОЕ СОЕДИНЕНИЕ

    Оно практически ничем не отличается от левого. В итоговую таблицу попадают все записи из правой таблицы, а из левой только те, для которых выполняется условие соединения. На практике правое соединение практически не используется и рассматривать его отдельно не будем. Есть даже небольшой забавный момент, связанный с правым соединением в конструкторе запросов 1С. Если при составлении запроса в конструкторе попытаться использовать правое соединение, то после нажатия кнопки ОК правое соединение будет автоматически преобразовано в левое.

    ВНУТРЕННЕЕ СОЕДИНЕНИЕ

    В случае внутреннего соединения в итоговую таблицу попадут только те записи как из левой, так и из правой таблицы, для которых выполняется условие соединения. Если в нашем последнем запросе мы заменим строку

    то в итоге получим:

    КодТовараНаименованиеЦенаДата
    001Яблоки12001.01.2016
    001Яблоки15001.02.2016
    002Апельсины20001.01.2016

    То есть запись с мандаринами у нас исчезла, т.к. для нее не нашлось соответствия в таблице с ценами.

    ПОЛНОЕ СОЕДИНЕНИЕ

    В случае полного соединения в итоговую таблицу попадут все записи из обоих таблиц.
    В нашем случае при использовании строки соединения

    получим следующий результат

    КодТовараНаименованиеЦенаДата
    001Яблоки12001.01.2016
    001Яблоки15001.02.2016
    002Апельсины20001.01.2016
    003МандариныNULLNULL
    NULLNULL35001.01.2016

    На практике полное соединение используется достаточно редко, но иногда бывает необходимо.

Для тех кто только начинает работать с запросами 1С8 советую посмотреть как разные виды соединений отображаются в конструкторе запросов на закладке «Связи».

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *