584 документа
← К списку

Как получить данные из разных таблиц для одного и того же поля

страница

Как получить данные из разных таблиц для одного и того же поля

Часто в результате запроса требуется вывести данные из разных таблиц, связав их по значению некоторого поля, то есть какие-то поля вывести из одной таблицы, какие-то – из другой для одного и того же значения поля из этих таблиц. Например, можно вывести для одного и того же товара количество его поступлений и продаж.

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

Исходные таблицы запроса обычно связываются (соединяются) между собой по некоторому условию – условию связи. Поле, по которому производится связь, обычно имеет ссылочный тип. При соединении данных из исходных таблиц запроса для каждой записи из этих таблиц проверяется условие равенства значений ссылочных полей этого типа. Условие связи источников запроса задается в предложении ИЗ, после ключевого слова ПО. Например, спрНоменклатура.Ссылка = ЦеныСрезПоследних.Номенклатура.

В зависимости от того, должны ли записи каждой из таблиц удовлетворять условию связи, таблицы соединяются внутренним, левым, правым или полным внешним соединением. В этом примере вы рассмотрите только один вид соединения – левое соединение. Ключевые слова, определяющие тип соединения (например, ЛЕВОЕ СОЕДИНЕНИЕ), располагаются между именами таблиц в предложении ИЗ.

Допустим, вы хотите вывести список номенклатуры из справочника Номенклатура и при этом показать для каждого элемента номенклатуры последнюю установленную на него цену.

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

Для выполнения поставленной задачи вам нужно соединить в запросе данные из таблиц Справочник.Номенклатура и РегистрСведений.Цены.СрезПоследних.

Регистр сведений Цены содержит поле Номенклатура, ссылающееся на справочник Номенклатура. По этому полю и будет осуществляться связь таблиц в запросе, то есть в условии связи для каждой записи из обеих таблиц будут сравниваться значения уникального поля Ссылка из справочника и ссылочного поля Номенклатура из среза последних записей регистра сведений.

Исходные данные, используемые в примере о соединении таблиц в запросе, представлены на рис. 11.28.

Рис. 11.28. Исходные записи справочника «Номенклатура» и регистра сведений «Цены»

Однако, как вы видите на рисунке, не для всех элементов справочника Номенклатура существует соответствующая им цена в срезе последних записей регистра сведений Цены. В частности, для записей справочника Радиодетали, Материалы, Телевизоры и других записей, являющихся группами, не найдено соответствий в регистре сведений, так как цены на них не имеют смысла.

Если связать таблицы справочника и регистра левым соединением, то в результат запроса попадут записи из обеих таблиц, удовлетворяющие условию связи, и кроме того – записи из первой таблицы, расположенной слева от ключевого слова СОЕДИНЕНИЕ, для которых не найдено соответствия во второй таблице (листинг 11.31).

Листинг **11.**31. Левое внешнее соединение справочника «Номенклатура» и среза последних записей регистра сведений «Цены»

ВЫБРАТЬ

спрНоменклатура.Код КАК Код,

спрНоменклатура.Наименование КАК Наименование,

ЦеныСрезПоследних.Цена КАК Цена

ИЗ

Справочник.Номенклатура КАК спрНоменклатура

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних КАК ЦеныСрезПоследних

ПО (спрНоменклатура.Ссылка = ЦеныСрезПоследних.Номенклатура)

 

УПОРЯДОЧИТЬ ПО

Код

Результат этого запроса представлен на рис. 11.29.

Рис. 11.29. Левое внешнее соединение данных справочника «Номенклатура» и среза последних записей регистра сведений «Цены»

Вы видите, что в результат запроса попали все 16 записей из справочника Номенклатура (рис. 11.28) независимо от того, была найдена соответствующая им запись из среза последних записей регистра сведений Цены или нет. Так произошло потому, что таблица Справочник.Номенклатура расположена слева от слова СОЕДИНЕНИЕ.

Строки результата запроса, для которых не найдено соответствующих условию записей из второго источника, будут содержать значение NULL в полях, формируемых на основании записей из этого источника. Обратите внимание, что значения NULL не являются нулем или пустой строкой. Значения данного типа обозначают неуказанные (отсутствующие) значения или значения, не имеющие смысла. В данном случае в поле Цена для номенклатуры Радиодетали, Прочее, Материалы,Услуги,Телевизоры и Стиральные машины будет находиться значение NULL.

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