# Использование вложенных запросов с помощью Direct Discovery

Если кардинальность ключевого поля, соединяющего таблицу, высока — то есть оно содержит большое количество уникальных значений — выборка в Qlik Sense может сгенерировать очень большой запрос SQL, так как выражение WHERE key\_field IN может включать большое число значений. В таком случае можно разрешить Qlik Sense вместо этого создать вложенные запросы.

Чтобы показать, как это работает, мы используем пример, где таблица продуктов (ProductTable) связана с таблицей заказов на продажу (SalesOrderDetail) через идентификатор продуктов (ProductID). Обе таблицы используются в режиме Direct Discovery.

![Две связанные таблицы.](https://help.qlik.com/ru-RU/sense/May2026/Subsystems/Hub/Content/Resources/Images/ex_gen_DirectDiscoverySubquery1.png)

Мы создаем диаграмму с измерением OrderMonth и мерой Sum(Subtotal), в панели фильтров выбираем Size.

![Панель фильтров, линейчатая диаграмма и таблица.](https://help.qlik.com/ru-RU/sense/May2026/Subsystems/Hub/Content/Resources/Images/ex_gen_DirectDiscoverySubquery2.png)

## Сценарий 1. Небольшое количество элементов

В этом сценарии таблица продуктов содержит небольшое количество уникальных продуктов, 266. Если выбрать значения в поле Size, Direct Discovery генерирует запрос SQL, который возвращает данные с помощью выражения WHERE ProductID IN, если они соответствуют выбранному размеру. В данном случае это 19 продуктов.

![Панель фильтров с выбранными значениями, линейчатая диаграмма и таблица.](https://help.qlik.com/ru-RU/sense/May2026/Subsystems/Hub/Content/Resources/Images/ex_gen_DirectDiscoverySubquery3.png)

Запрос SQL выглядит следующим образом:

```
SELECT ProductID, month([OrderDate]), SUM(OrderQty), SUM(SubTotal)
```

```
FROM  SalesTable
```

```
WHERE ProductID IN ( 12, 51, 67, 81, 89, 92, 100, 108, 142, 150, 151, 162, 191, 206, 220, 222, 251, 254)
```

GROUP BY ProductID, month([OrderDate])

## Сценарий 2. Использование вложенных запросов

Если в этом примере содержится большое количество уникальных продуктов, например 20 000, при выборе значений в фильтре измерения, например Size, генерируется запрос SQL с условием WHERE ProductID IN , возвращающий тысячи ID продуктов. Оператор может получиться слишком большим для обработки источником данных из-за ограничений, ошибок в памяти или производительности.

В таком случае можно разрешить Qlik Sense вместо этого создать вложенные запросы. Для этого установите для параметра DirectEnableSubquery значение «true». Вместо этого запрос SQL будет выглядеть следующим образом:

SELECT ProductID, month([OrderDate]), SUM(OrderQty), SUM(SubTotal)

FROM SalesTable

WHERE ProductID IN

( SELECT DISTINCT "AW2012"."dbo"."PRODUCT"."PRODUCTID" WHERE "AW2012"."dbo"."PRODUCT"."SIZE" IN (3))

GROUP BY ProductID, month([OrderDate])

Размер результата по условию WHERE ProductID IN теперь не зависит от количества ключей, полученных из выборки.

При использовании вложенных запросов существует ряд ограничений.

* Синтаксис вложенного запроса срабатывает только при выборе данных, которые включают в себя фильтрацию диаграммы с помощью данных из другой таблицы.
* Количество данных в ключах является определяющим фактором, а не количество ключей.
* Вложенные запросы срабатывают только если все включенные таблицы находятся в режиме Direct Discovery. Если выполнить фильтрацию диаграммы с помощью данных из таблицы в памяти, будет создано предложение IN.