Оператор ИМЕЮЩИЕ
2 мин
Операртор ИМЕЮЩИЕ - работает аналогично оператору ГДЕ, но накладывает отбор не на значения полей таблицы, а на результат выполнения агрегатных функций. Так как использование оператора ИМЕЮЩИЕ подразумевает использование агрегатных функций, то запрос так же должен содержать и оператор СГРУППИРОВАТЬ ПО, в котором должны быть перечислены все поля не использующиеся в агрегатных функциях. Следует так же учитывать, что результат запроса так же будет сгруппирован.
Пример синтаксиса:
ВЫБРАТЬ
Таблица .Ссылка КАК Ссылка
ИЗ
Таблица КАК Таблица
СГРУППИРОВАТЬ ПО
Таблица .Ссылка
ИМЕЮЩИЕ МИНИМУМ(*) > 1
Теперь к примерам. В языке запросов 1С есть возможность агрегирования данных, с помощью агрегатных функций. С помощью них мы можем вычислить например сумму всех элементов в колонке таблицы, или найти максимальное значение.
Но иногда у нас возникает необходимость использовать результат агрегатной функции в отборе. Например мы хотим найти всех производителей, у которых есть более двух моделей диванов.
Без использования оператора ИМЕЮЩИЕ нам придется выполнить два запроса, иначе никак.
В первом мы найдем сначала среднее значение цены. А во втором будем делать отбор по этому значению:
ВЫБРАТЬ
ПроизводителиСКоличеством.Производитель КАК Производитель
ИЗ
(
ВЫБРАТЬ
Диваны.Производитель КАК Производитель,
КОЛИЧЕСТВО(*) КАК Количество
ИЗ
Справочник.Диваны КАК Диваны
СГРУППИРОВАТЬ ПО
Диваны.Производитель
) КАК ПроизводителиСКоличеством
ГДЕ
ПроизводителиСКоличеством.Количество > 2
Здесь мы использовали получение данных из вложенного запроса. Выглядит довольно сложно и требует получения данных в два приема.
Чтобы немного упростить чтение и отладку этого решения можно было бы использовать временную таблицу. Но это тоже заставляет писать довольно большой запрос:
ВЫБРАТЬ
Диваны.Производитель КАК Производитель,
КОЛИЧЕСТВО(*) КАК Количество
ПОМЕСТИТЬ ВТПроизводителиСКоличеством
ИЗ
Справочник.Диваны КАК Диваны
СГРУППИРОВАТЬ ПО
Диваны.Производитель
;
ВЫБРАТЬ
ПроизводителиСКоличеством.Производитель КАК Производитель
ИЗ
ВТПроизводителиСКоличеством КАК ПроизводителиСКоличеством
ГДЕ
ПроизводителиСКоличеством.Количество > 2
Все равно мы не смогли избавиться от получения данных в два приема, хоть читать запрос и стало несколько проще.
Здесь нам на помощь и приходит оператор ИМЕЮЩИЕ
С помощью него мы можем получить тот же результат за меньшее количество действий
ВЫБРАТЬ
Диваны.Производитель КАК Производитель
ИЗ
Справочник.Диваны КАК Диваны
СГРУППИРОВАТЬ ПО
Диваны.Производитель
ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 2
С помощью такого лаконичного запроса можно получить тот же самый результат.