Перейти к содержимому

7.9 При соединении таблиц-источников данных в конструкторе запросов можно

Опубликовано: Обновлено:

Telegram → Просто о платформе 1С

❓ 7.9 При соединении таблиц-источников данных в конструкторе запросов можно:


Источники данных и их соединения описываются в секции ИЗ запроса:

ВЫБРАТЬ [РАЗРЕШЕННЫЕ] [РАЗЛИЧНЫЕ] [ПЕРВЫЕ <Количество>]
<Список полей выборки>
[ПОМЕСТИТЬ|ДОБАВИТЬ <Имя таблицы>]
[ИЗ <Список источников>]
[ИНДЕКСИРОВАТЬ ПО [НАБОРАМ] <Список полей>]
[ГДЕ <Условие отбора>]
[СГРУППИРОВАТЬ ПО <Поля группировки>]
[ИМЕЮЩИЕ <Условие отбора>]
[ДЛЯ ИЗМЕНЕНИЯ [<Список таблиц верхнего уровня>]]

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

ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены КАК Цены
ПО Номенклатура.Ссылка = Цены.Номенклатура

Язык запросов позволяет использовать четыре явно задаваемых типа соединения.

ТипКлючевые словаЧто попадает в результат
ВнутреннееСОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕТолько строки обеих таблиц, которые соответствуют условию соединения
ЛевоеЛЕВОЕ СОЕДИНЕНИЕ или ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕВсе строки левого источника и соответствующие им строки правого
ПравоеПРАВОЕ СОЕДИНЕНИЕ или ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕВсе строки правого источника и соответствующие им строки левого
ПолноеПОЛНОЕ СОЕДИНЕНИЕ или ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕВсе строки обоих источников

Ключевое слово ВНЕШНЕЕ для левого, правого и полного соединений можно не указывать.

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

Рассмотрим виды соединений на одинаковых исходных данных.

Левая таблица          Правая таблица

Товар А                Товар А — Цена 100
Товар Б                Товар А — Цена 120
Товар В                Товар Г — Цена 200

      ВНУТРЕННЕЕ СОЕДИНЕНИЕ
            по товару
               ↓

Товар А — Цена 100
Товар А — Цена 120

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

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

Левая таблица          Правая таблица

Товар А                Товар А — Цена 100
Товар Б                Товар А — Цена 120
Товар В                Товар Г — Цена 200

        ЛЕВОЕ СОЕДИНЕНИЕ
            по товару
               ↓

Товар А — Цена 100
Товар А — Цена 120
Товар Б — NULL
Товар В — NULL

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

Левая таблица          Правая таблица

Товар А                Товар А — Цена 100
Товар Б                Товар А — Цена 120
Товар В                Товар Г — Цена 200

        ПРАВОЕ СОЕДИНЕНИЕ
            по товару
               ↓

Товар А — Цена 100
Товар А — Цена 120
NULL    — Цена 200

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

Левая таблица          Правая таблица

Товар А                Товар А — Цена 100
Товар Б                Товар А — Цена 120
Товар В                Товар Г — Цена 200

        ПОЛНОЕ СОЕДИНЕНИЕ
            по товару
               ↓

Товар А — Цена 100
Товар А — Цена 120
Товар Б — NULL
Товар В — NULL
NULL    — Цена 200

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

Источники в секции ИЗ могут быть перечислены без явного соединения:

ИЗ
Справочник.Номенклатура КАК Номенклатура,
Справочник.Склады КАК Склады

В этом случае формируется декартово произведение: каждая строка одного источника сочетается с каждой строкой другого.

Левая таблица          Правая таблица

Товар А                Склад 1
Товар Б                Склад 2

        БЕЗ УСЛОВИЯ СВЯЗИ
               ↓

Товар А — Склад 1
Товар А — Склад 2
Товар Б — Склад 1
Товар Б — Склад 2

Например, если один источник содержит 3 строки, а второй — 4, результат такого сочетания будет содержать 3 × 4 = 12 строк.

Это не отдельный тип соединения с собственным ключевым словом СОЕДИНЕНИЕ, а результат использования нескольких источников без условия их связи.

Если в запросе участвуют несколько таблиц, в конструкторе становится доступна закладка «Связи».

На ней задаются:

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

Тип соединения в конструкторе определяется состоянием двух флажков «Все»:

Левая таблицаПравая таблицаТип соединения
☐☐Внутреннее
☑☐Левое
☐☑Правое
☑☑Полное

Смысл флажка «Все» — включить в результат все строки соответствующей стороны, даже если для них не найдено соответствия в другой таблице.

Условие после ПО не ограничено сравнением одного реквизита. Оно может содержать несколько условий и выражения языка запросов.

Например:

ПО Цены.Номенклатура = Номенклатура.Ссылка
И Цены.ВидЦены = &ВидЦены

Важно отличать условие соединения ПО от условия отбора в секции ГДЕ.

ИЗ
Источник1
ЛЕВОЕ СОЕДИНЕНИЕ Источник2
ПО <условие соединения>
ГДЕ
<условие отбора результата>

ПО определяет, какие строки источников соответствуют друг другу при соединении, а ГДЕ отбирает строки уже формируемого результата запроса.


Соединение источников описывается в секции ИЗ, а соответствие строк задается условием ПО. В конструкторе запросов тип соединения определяется флажками «Все» для левой и правой таблиц; если несколько источников используются без связи между ними, формируется их декартово произведение.