Механизм соединения таблиц, участвующих в запросе, позволяет дополнительно ограничивать состав данных, получаемых в результате выполнения запроса. Если в операторе ИЗ перечислить несколько таблиц, а в операторе ВЫБРАТЬ задать некоторые поля из этих таблиц, то результатом будут все возможные сочетания значений полей таблиц. Для ограничения выборки используют операторы соединения таблиц.
Различают четыре вида соединения:
[ВНУТРЕННЕЕ] СОЕДИНЕНИЕ
ЛЕВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ
ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ
ПОЛНОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ
Рассмотрим различие вариантов соединения на следующем примере. Пусть есть две таблицы:
Таблица 1
Номенкл.
Номер1
Ручка
Карандаш
Вилка
Таблица 2
ЕдИзм
Номер2
Шт
Гр
Кг
Банка
Пусть условием связи будет:
Таблица1.Номер1=Таблица2.Номер2
В качестве полей запроса определим две колонки: «Номенкл.» из первой таблицы и «ЕдИзм» из второй таблицы.
В соответствии с условием можно выделить записи, для которых условие выполняется:
Записи, неудовлетворяющие условию соединения:
Теперь рассмотрим варианты соединения:
Внутреннее соединение:в результат выполнения запроса войдут только данные записей из обеих таблиц, для которых выполняется условие соединения т.е.
Ручка
Шт.
Ручка
банка
Вилка
Гр.
Левое внешнее соединение:в результат выполнения запроса войдут данные из записей, для которых выполняется условие соединения и «не вошедшие» из Таблицы №1.
Ручка
Шт.
Ручка
банка
Вилка
Гр.
Карандаш
Null
Правое внешнее соединениеобратно левому.
Ручка
Шт.
Ручка
банка
Вилка
Гр.
Null
Кг.
Полное внешнее соединение.В результат запроса войдут как записи, для которых выполнялось условие соединения, так и записи, полученные из «не вошедших» данных из обеих таблиц.
Ручка
Шт.
Ручка
банка
Вилка
Гр.
Карандаш
Null
Null
Кг.
В любом случае, даже в результате использования полного внешнего соединения не получается полная комбинация значений. (В случае полного соединения добавляются записи, не удовлетворяющие условию, а не все возможные их комбинации).
// Показать курсы всех валют, которые хранятся в регистре сведений КурсыВалют.
// Возможно, что для некоторой валюты не будет найдено соответствующей записи в регистре
// сведений, но она также должна попасть в отчет.
| ВЫБРАТЬ Спр.Наименование, Рег.Курс
| ИЗ Справочник.Валюты КАК Спр
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.КурсыВалют.СрезПоследних() КАК Рег
| ПО Спр.Ссылка = Рег.Валюта
// Или то же самое можно сделать так:
| ВЫБРАТЬ Спр.Наименование, Рег.Курс
| ИЗ РегистрСведений.КурсыВалют.СрезПоследних() КАК Рег
| ПРАВОЕ СОЕДИНЕНИЕ
| Справочник.Валюты КАК Спр
| ПО Спр.Ссылка = Рег.Валюта
Часто требуется представить результат выполнения запроса упорядоченным по какому-то полю или группе полей. Для этого используется оператор
УПОРЯДОЧИТЬ ПО СписокПолей
Для каждого поля из списка можно указать порядок сортировки: ВОЗР, УБЫВ, ИЕРАРХИЯ. Если порядок не указан то сортировка происходит по возрастанию.
Последний порядок (ИЕРАРХИЯ) работает только для таблиц с иерархией, например таблиц иерархических справочников. Упорядочивание происходит сначала по первому полю списка, затем в рамках уже существующей сортировки упорядочивание по второму полю и т.д.
| ВЫБРАТЬ Наименование КАК Товар
| ИЗ Справочник.Номенклатура
| УПОРЯДОЧИТЬ ПО Товар ИЕРАРХИЯ");
Ключевое слово ПЕРВЫЕ ограничивает выборку несколькими первыми записями. Часто это слово используется в комбинации с упорядочиванием.
// Найти 3 самых дорогих товара
| ВЫБРАТЬ ПЕРВЫЕ 3 Наименование КАК Товар, ЦенаПродажи КАК Цена