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