Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51757
Скачиваний: 8724
При этом порядок следования полей таблиц в условии связи значения не имеет, важно
лишь, какая таблица расположена слева, а какая – справа от слова СОЕДИНЕНИЕ.
Полное соединение
При полном соединении таблиц в результат запроса будут включены записи из обеих
исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат
запроса будут включены также еще и те записи из обоих источников, для которых не
найдено соответствий.
Предположим, нам необходимо вывести все записи из справочника Товары и срез всех
последних записей из регистра сведений Цены. При этом нужно показать актуальную цену
для тех товаров, на которые она устанавливалась. Для этого нам нужно соединить в
запросе данные из таблиц Справочник.Товары и
РегистрСведений.Цены.СрезПоследних полным внешним соединением (листинг 1.75).
Листинг 1.75. Полное внешнее соединение данных справочника «Товары» и среза последних записей регистра
сведений «Цены»
Результат запроса представлен на рис. 1.71.
Рис. 1.71. Полное внешнее соединение данных справочника «Товары» и среза последних записей регистра сведений
«Цены»
Мы видим, что в результат запроса попали все записи из исходных таблиц запроса. Но в
нашем частном случае мы получили результат, полностью аналогичный примеру с левым
соединением (см. рис. 1.69), так как все товары, для которых установлены цены в
регистре сведений, присутствуют в справочнике Товары. Для тех товаров, на которые
устанавливалась цена, она найдена в срезе последних записей регистра сведений и
отражена в результате запроса.
Строки результата запроса, для которых не найдено соответствующих условию записей
из какого-либо источника, будут содержать значение NULL в полях, формируемых на
основании записей из этого источника.
Следует иметь в виду, что при работе в клиент-серверном варианте, когда в качестве
СУБД используется PostgreSQL, производительность выполнения запросов с
конструкцией ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ значительно снижается. В особенности
это касается случаев, когда в запросе встречаются две и более такие конструкции.
Поэтому в общем случае не рекомендуется использовать полное внешнее соединение в
запросах. И в тех случаях, где это возможно, рекомендуется переписать текст исходного
запроса без использования этой конструкции.
Выше мы рассматривали различные виды соединения источников запроса на примере
двух таблиц базы данных. В общем случае в запросе может содержаться не только одно
соединение (двух источников), но и несколько соединений нескольких источников сразу.
Об этом рассказывается в следующем примере.
Кроме того, в соединении источников могут участвовать и вложенные запросы. Однако
соединения с вложенными запросами крайне нежелательны, так как в большинстве
случаев могут привести к неоптимальному выполнению запроса.
Подробнее
Не использовать соединения с вложенными запросами и с виртуальными
Как получить данные из разных таблиц, связанных несколькими соединениями
Рассмотрим теперь более сложную задачу, когда в результате запроса используется
несколько соединений данных из нескольких таблиц, и проанализируем подробно каждый
этап такого соединения. Предположим, нам необходимо вывести перечень товаров из
справочника Товары и при этом показать остаток каждого товара и количество его
продаж.
В нашей демонстрационной конфигурации существует регистр накопления
ОстаткиТоваров, который накапливает информацию о приходе и расходе товаров.
Виртуальная таблица Остатки этого регистра накопления позволяет получить
информацию об остатках каждого товара. Также в конфигурации существует регистр
накопления Продажи, который накапливает информацию о продажах товаров.
Виртуальная таблица Обороты этого регистра накопления позволяет получить
информацию о количестве и сумме оборотов (продаж) каждого товара.
Поэтому для выполнения поставленной задачи нам нужно соединить в запросе данные из
таблиц Справочник.Товары, РегистрНакопления.ОстаткиТоваров.Остатки и
РегистрНакопления.Продажи.Обороты.
подробнее
В данном примере для большей наглядности мы используем виртуальную таблицу
Остатки
регистра накопления
ОстаткиТоваров
и виртуальную таблицу
Обороты
регистра накопления
Продажи
. Подробнее о назначении и использовании виртуальных
таблиц регистра накопления будет рассказано в разделах «
»,
».
Регистры накопления ОстаткиТоваров и Продажи содержат поле Товар, ссылающееся
на справочник Товары. По полю этого типа и будет производиться связь таблиц в
запросе, то есть в условии связи для каждой записи из исходных таблиц будут
сравниваться значения уникального поля Ссылка из справочника и ссылочного поля
Товар из виртуальных таблиц Остатки или Обороты регистров накопления.
Исходные данные, используемые в примере о соединении таблиц в запросе,
представлены на рис. 1.72.
Рис. 1.72. Исходные записи справочника «Товары» и виртуальных таблиц регистров накопления «ОстаткиТоваров» и
«Продажи»
На рис. 1.72 мы видим, что в справочнике Товары отражаются семь записей, которые не
являются группой, так как на таблицу справочника наложено соответствующее условие.
Также мы видим, что записи всех трех таблиц, используемых в примере, не полностью
соответствуют друг другу по полю Товар. Так, товар Пинетки ни разу не продавался и
не поступал (не имеет остатка), т. к. он новый. Товар Сметана имеет остаток, но он ни
разу не продавался. Товары Сапоги и Масло полностью проданы, т. е. они не имеют
остатка. Эти особенности будут отражены в результате запроса, когда мы будем
связывать данные всех таблиц между собой разными видами соединений.
Сначала свяжем данные всех трех таблиц левыми соединениями и выведем из
справочника Товары поле Товар, из виртуальной таблицы Остатки регистра накопления
ОстаткиТоваров (таблицы остатков) – поле КоличествоОстаток, из виртуальной
таблицы Обороты регистра накопления Продажи (таблицы оборотов) – поле
КоличествоОборот (листинг 1.76).
Листинг 1.76. Левое соединение данных справочника «Товары» и данных таблиц остатков и оборотов товаров
Результат запроса представлен на рис. 1.73.
Рис. 1.73. Левое соединение данных справочника «Товары» и данных таблиц остатков и оборотов товаров
Мы видим, что в результат запроса попали все записи (7 товаров) из справочника
Товары, как и должно быть при левом соединении. Для каждого товара были найдены
соответствующие записи в таблицах остатков и оборотов товаров и подставлены в
результат запроса.
Если проанализировать текст запроса, представленный в листинге 1.76, то понятно, что
сначала выполняется левое соединение справочника Товары с виртуальной таблицей
остатков. Результат этого соединения мы видим на рис. 1.74, слева. Для каждого товара
из справочника ищется соответствующая запись в таблице остатков, и найденный остаток
выводится для конкретного товара. Товары, у которых нет остатка (Сапоги, Масло,
Пинетки), также попадают в результат соединения.
Рис. 1.74. Левое соединение данных справочника «Товары» и данных таблиц остатков и оборотов товаров
На следующем этапе результат этого первого соединения (см. рис. 1.74, левая таблица)
связывается левым соединением с виртуальной таблицей оборотов. Для каждого товара
из результата первого соединения ищется соответствующая запись в таблице оборотов,
и найденное количество продаж выводится для конкретного товара. Товары, которые ни
разу не продавались (Сметана, Пинетки), также попадают в результат запроса (см.
рис. 1.74, правая таблица).