К статьям

Оператор ИМЕЮЩИЕ

2 мин


Операртор ИМЕЮЩИЕ - работает аналогично оператору ГДЕ, но накладывает отбор не на значения полей таблицы, а на результат выполнения агрегатных функций. Так как использование оператора ИМЕЮЩИЕ подразумевает использование агрегатных функций, то запрос так же должен содержать и оператор СГРУППИРОВАТЬ ПО, в котором должны быть перечислены все поля не использующиеся в агрегатных функциях. Следует так же учитывать, что результат запроса так же будет сгруппирован.

Пример синтаксиса:

ВЫБРАТЬ

     Таблица .Ссылка КАК Ссылка

ИЗ

    Таблица КАК Таблица 

СГРУППИРОВАТЬ ПО

    Таблица .Ссылка 

ИМЕЮЩИЕ МИНИМУМ(*) > 1

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

Но иногда у нас возникает необходимость использовать результат агрегатной функции в отборе. Например мы хотим найти всех производителей, у которых есть более двух моделей диванов. 

Без использования оператора ИМЕЮЩИЕ нам придется выполнить два запроса, иначе никак.

В первом мы найдем сначала среднее значение цены. А во втором будем делать отбор по этому значению:

 

 ВЫБРАТЬ

   ПроизводителиСКоличеством.Производитель КАК Производитель

ИЗ

   (

    ВЫБРАТЬ

        Диваны.Производитель КАК Производитель,

        КОЛИЧЕСТВО(*) КАК Количество

    ИЗ

        Справочник.Диваны КАК Диваны

    СГРУППИРОВАТЬ ПО

        Диваны.Производитель

    ) КАК ПроизводителиСКоличеством

ГДЕ

    ПроизводителиСКоличеством.Количество > 2     

 

Здесь мы использовали получение данных из вложенного запроса. Выглядит довольно сложно и требует получения данных в два приема. 

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

 

 ВЫБРАТЬ

      Диваны.Производитель КАК Производитель,

    КОЛИЧЕСТВО(*) КАК Количество

ПОМЕСТИТЬ ВТПроизводителиСКоличеством

ИЗ

    Справочник.Диваны КАК Диваны

СГРУППИРОВАТЬ ПО

    Диваны.Производитель

;

ВЫБРАТЬ

    ПроизводителиСКоличеством.Производитель КАК Производитель

ИЗ

    ВТПроизводителиСКоличеством КАК ПроизводителиСКоличеством

ГДЕ

    ПроизводителиСКоличеством.Количество > 2    

   

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

Здесь нам на помощь и приходит оператор ИМЕЮЩИЕ

С помощью него мы можем получить тот же результат за меньшее количество действий

 ВЫБРАТЬ

     Диваны.Производитель КАК Производитель

ИЗ

    Справочник.Диваны КАК Диваны

СГРУППИРОВАТЬ ПО

    Диваны.Производитель

ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 2  

С помощью такого лаконичного запроса можно получить тот же самый результат. 

Задачи на эту тему:

Рейтинг 0

Комментарии