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

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

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

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

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

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

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

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

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

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

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

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

  • Внутреннее соединение
  • Левое внешнее соединение
  • Правое внешнее соединение
  • Полное внешнее соединение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Декартово произведение через полное соединение

Как мы уже знаем декартово произведение таблиц можно получить если не указать условие соединения. Также его можно получить через полное соединение, указав условие ПО ИСТИНА:

Декартово произведение

Однако разница есть. Если одна из таблиц будет пустой, то если не указать соединение, то и результат будет пустой. А при полном соединении в результате будут все записи одной таблицы.


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok