Спецификации соединений
При определении нескольких источников в списке источников для каждой записи из первой таблицы-источника осуществляется выборка из второй таблицы-источника, и т.д. Таким образом, в результате запроса формируются все возможные комбинации всех записей из всех указанных источников.
Пример:
Выбрать
Контрагенты.Ссылка Как Контрагент,
Банки.Ссылка Как Банк
Из
Справочник.Контрагенты Как Контрагенты,
Справочник.Банки Как Банки
Результат запроса:
Контрагент | Банк |
Поставщики | АКБ ИвестБанк |
Поставщики | АКБ ПромСтройБанк |
Трикотажная фабрика «Заря» | АКБ ИвестБанк |
Трикотажная фабрика «Заря» | АКБ ПромСтройБанк |
Фабрика джинсовой одежды | АКБ ИвестБанк |
Фабрика джинсовой одежды | АКБ ПромСтройБанк |
Покупатели | АКБ ИвестБанк |
Покупатели | АКБ ПромСтройБанк |
Ярмарка одежды | АКБ ИвестБанк |
Ярмарка одежды | АКБ ПромСтройБанк |
Торговый дом «Буденовский» | АКБ ИвестБанк |
Торговый дом «Буденовский» | АКБ ПромСтройБанк |
Павильон 45 на оптовом рынке | АКБ ИвестБанк |
Павильон 45 на оптовом рынке | АКБ ПромСтройБанк |
Бавария - фарфор | АКБ ИвестБанк |
Бавария - фарфор | АКБ ПромСтройБанк |
Фабрика джинсовой одежды | АКБ ИвестБанк |
Фабрика джинсовой одежды | АКБ ПромСтройБанк |
АКБ ПромСтройБанк | АКБ ИвестБанк |
АКБ ПромСтройБанк | АКБ ПромСтройБанк |
Результат запроса содержит комбинации всех контрагентов со всеми банками. Как правило, такой результат сам по себе смысла не имеет. Обычно комбинации записей из разных исходных таблиц требуется ограничить какими-либо условиями. В языке запросов имеется возможность описать такое соединение источников, указывая сами источники и определяя условия, в соответствии с которыми комбинации записей из этих источников требуется включить в результат запроса.
Соединения бывают нескольких видов, они описываются следующими правилами:
<Соединение> [<Перечень соединений>]
В общем случае <Перечень соединений> может содержать и описывать не только одно соединение (двух источников), но и несколько соединений нескольких источников сразу.
<Соединение>
[ВНУТРЕННЕЕ] СОЕДИНЕНИЕ <Описание источника> ПО <Условие отбора> |
ЛЕВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ <Описание источника> ПО <Условие отбора> |
ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ <Описание источника> ПО <Условие отбора> |
ПОЛНОЕ (ВНЕШНЕЕ] СОЕДИНЕНИЕ <Описание источника> ПО <Условие отбора>
<Описание источника> содержит описание исходной таблицы - см. раздел « Описание источников запроса» на стр. 305.
<Условие отбора> содержит условия, в соответствии с которыми в выборке необходимо соединить данные из исходных таблиц - источников запроса. Правила описания условий в языке запросов рассматриваются на стр. 357.
Ключевые слова ЛЕВОЕ, ПРАВОЕ и ПОЛНОЕ уточняют характер соединения. Слова ВНУТРЕННЕЕ или ВНЕШНЕЕ можно не указывать вообще, они повышают наглядность и удобочитаемость текста запроса.
Соединяемые источники не равнозначны между собой, и в некоторых случаях результат зависит от того, какая таблица указана первой, до ключевого слова СОЕДИНЕНИЕ (слева от него), а какая - второй (справа).
Внутреннее соединение
[ВНУТРЕННЕЕ] СОЕДИНЕНИЕ означает, что из обеих исходных таблиц - источников данных в результат запроса необходимо включить только те комбинации записей, которые соответствуют указанному условию. Остальные записи в результат не попадают.
Пример:
// Необходимо выяснить, какие банки является одновременно
// контрагентами (одинаковые наименования присутствует
//и в справочнике Контрагенты, и в справочнике Банки).
Выбрать
Контрагенты.Ссылка Как Контрагент,
Банки.Ссылка Как Банк
Из
Справочник.Контрагенты Как Контрагенты
Внутреннее Соединение
Справочник.Банки Как Банки
По
Контрагенты.Наименование = Банки.Наименование
Результат запроса:
Контрагент | Банк |
АКБ ПромСтройБанк | АКБ ПромСтройБанк |
ЛЕВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Но, в отличие от внутреннего соединения, в результат запроса надо включить также еще и записи из первого (указанного слева от слова СОЕДИНЕНИЕ) источника, для которых не найдено соответствующих условию записей из второго источника.
Таким образом, в результат запроса будут включены все записи из первого источника; они будут соединены с записями из второго источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из второго источника, будут содержать NULL в полях, формируемых на основании записей из этого источника.
Пример:
//В отчет необходимо вывести всех контрагентов, а для тех,
// кто является также банком - указать ссылку на банк.
Выбрать
Контрагенты.Ссылка Как Контрагент,
Банки.Ссылка Как Банк
Из
Справочник.Контрагенты Как Контрагенты
Левое Внешнее Соединение
Справочник.Банки Как Банки
По
Контрагенты.Наименование = Банки.Наименование
Результат запроса:
Контрагент | Банк |
Поставщики | NULL |
Трикотажная фабрика «Заря» | NULL |
Фабрика джинсовой одежды | NULL |
Покупатели | NULL |
Ярмарка одежды | NULL |
Торговый дом «Буденовский» | NULL |
Павильон 45 на оптовом рынке | NULL |
Бавария - фарфор | NULL |
Фабрика джинсовой одежды | NULL |
АКБ ПромСтройБанк | АКБ ПромСтройБанк |
ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить также еще и записи из второго (указанного справа от слова СОЕДИНЕНИЕ) источника, для которых не найдено соответствующих условию записей из первого источника.
Таким образом, в результат запроса будут включены все записи из второго источника; они будут соединены с записями из первого источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из первого источника, будут содержать NULL в полях, формируемых на основании записей из этого источника.
Пример:
//В отчет необходимо вывести все банки, а для тех,
// кто является также и контрагентом - указать ссылку на контрагента.
ВЫБРАТЬ
Контрагенты.Ссылка Как Контрагент,
Банки.Ссылха Как Банк
ИЗ
Справочник.Контрагенты Как Контрагенты
Правое Внешнее Соединение
Справочник.Банки Как Банки
По
Контрагенты.Наименование = Банки.Наименование
Результат запроса:
Контрагент | Банк |
NULL | АКБ ИвестБанк |
АКБ ПромСтройБанк | АКБ ПромСтройБанк |
ПОЛНОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить также еще и те записи из обоих источников, для которых не найдено соответствий.
Таким образом, в результат запроса будут включены все записи из обоих источников; они будут соединены друг с другом при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из какого-либо источника, будут содержать NULL в полях, формируемых на основании записей из этого источника.
Пример:
// В отчет необходимо вывести всех контрагентов и все банки,
// а.тех, кто является и тем, и другим - вывести в одной строке.
Выбрать
Контрагенты.Ссылка Как Контрагент,
Банки.Ссылка Как Банк
Из
Справочник.Контрагенты Как Контрагенты
Полное Внешнее Соединение
Справочник.Банки Как Банки
По
Контрагенты.Наименование = Банки.Наименование
Результат запроса:
Контрагент | Банк |
Поставщики | NULL |
Трикотажная фабрика «Заря» | NULL |
Фабрика джинсовой одежды | NULL |
Покупатели | NULL |
Ярмарка одежды | NULL |
Торговый дом «Буденовский» | NULL |
Павильон 45 на оптовом рынке | NULL |
Бавария - фарфор | NULL |
Фабрика джинсовой одежды | NULL |
АКБ ПромСтройБанк | АКБ ПромСтройБанк |
NULL | АКБ ИвестБанк |