## Ссылки на модели и сохраненные вопросы В базах данных SQL мы можем использовать [модель][models] или существующий вопрос в качестве основы для нового запроса или в качестве общего табличного выражения [CTE][CTE]. Например, предположим, что у нас есть много данных, разбросанных по нескольким таблицам, но наших пользователей больше всего интересует подмножество этих данных. Мы можем выполнить сложный запрос один раз, чтобы вернуть эти результаты, и сохранить этот вопрос как модель, на которую люди могут ссылаться в своих запросах так же, как на любую друную таблицу. Это работает следующим образом: сначала создайте и сохраните вопрос, который возвращает набор данных, который вы хотите сделать доступным для последующих запросов. Используя образец базы данных, включенный в GlarusBI в качестве примера, предположим, что мы хотим предоставить результирующий набор («таблицу»), который содержит заказы только с 2019 года и включает только заказы на продукты в категории Gizmo. Мы могли бы создать эту модель с помощью редактора блокнота, например: ![Пример блокнота](../images/example-notebook.png) В качестве альтернативы мы могли бы создать эту модель из вопроса SQL: ``` SELECT * FROM orders AS o INNER JOIN products AS p ON o.product_id = p.id WHERE p.category = 'Gizmo' AND o.created_at BETWEEN '2019-01-01' AND '2019-12-31' ``` Мы сохраним этот вопрос как «Заказы Gizmo в 2019 году», а затем преобразуем его в [модель][models]. Теперь давайте обратимся к «Заказы Gizmo в 2019 году» в новом запросе. Для простоты предположим, что мы просто хотим подсчитать все эти заказы Gizmo за 2019 год. Мы можем использовать символ `#` для ссылки на сохраненный вопрос в запросе. Если мы напишем: ``` SELECT count(*) FROM {% raw %}{{#{% endraw %} ``` GlarusBI выдвинет боковую панель, где мы можем выбрать вопрос для ссылки. Мы будем искать наш вопрос «Заказы Gizmo в 2019 году»: ![Выберите вопрос на боковой панели переменных](../images/variable-sidebar.png) Мы выберем этот вопрос, и GlarusBI обновит наш код с идентификатором вопроса, `5`: ``` SELECT count(*) FROM {% raw %}{{#5-gizmo-orders-in-2019}}{% endraw %} ``` Этот запрос возвращает количество строк в нашем сохраненном вопросе. ## Модель, таблица или сохраненный вопрос в виде Общего табличного выражения (CTE) Тот же синтаксис можно использовать в [Общем табличном выражении (CTEs)](https://www.metabase.com/learn/sql-questions/sql-cte) (с базами данных SQL, которые поддерживают CTE): ``` WITH gizmo_orders AS {% raw %}{{#5-gizmo-orders-in-2019}}{% endraw %} SELECT count(*) FROM gizmo_orders ``` При выполнении этого запроса тег `{% raw %}{{#5-gizmo-orders-in-2019}}{% endraw %}` будет заменен SQL-запросом указанного вопроса, заключенным в круглые скобки. Итак, под капотом это будет выглядеть так: ``` WITH gizmo_orders AS (SELECT * FROM orders AS o INNER JOIN products AS p ON o.product_id = p.id WHERE p.category = 'Gizmo' AND o.created_at BETWEEN '2019-01-01' AND '2019-12-31') SELECT count(*) FROM gizmo_orders ``` ## Ищите модели и вопросы по мере ввода Используйте поиск по типу в вашей переменной, чтобы найти свою модель или вопрос. Введите `{% raw %}{{#ваш поисковый запрос }} {% endraw %}`, и GlarusBI отобразит выбор вопроса на боковой панели переменных в редакторе SQL и автоматически добавит идентификационный номер к переменной в нашем запросе. Вы также можете перейти к модели или вопросу, на который хотите сослаться, и найти его идентификатор в URL-адресе после `/model/` или `/question/`. Например, для `https://metabase.example.com/model/12345-example-name` идентификатор модели будет `12345`. ## Ограничения и компромиссы - Вы можете ссылаться на модель или сохраненный вопрос в запросе только при работе с базой данных SQL, такой как PostgreSQL, MySQL или SQL Server. - Выбранная вами модель или сохраненный вопрос должны быть основаны на той же базе данных, что и та, которую вы сейчас выбрали в собственном редакторе запросов. - Вы не можете ссылаться на переменные в подзапросах. У вас есть доступ только к _результатам_ модели или сохраненного вопроса, но не к модели или сохраненному запросу вопроса. Например, если у вас есть сохраненный вопрос, в котором используется [фильтр полей](https://www.metabase.com/learn/building-analytics/sql-templates/field-filters), вы не сможете ссылаться на эту переменную. Если вам нужно изменить способ фильтрации результатов сохраненным вопросом, вам потребуется обновить (или продублировать) этот вопрос и применить фильтр. ## Дополнительная информация - [Модели](../../data-modeling/models.md) - [SQL фрагменты. Документация Metabase](https://www.metabase.com/learn/building-analytics/sql-templates/sql-snippets.html) - [Фрагменты SQL против сохраненных вопросов и просмотров. Документация Metabase](https://www.metabase.com/learn/building-analytics/sql-templates/organizing-sql.html) - [Гид по сложностям с SQL](../../troubleshooting-guide/sql.md). - [Сегменты и метрики](../../data-modeling/segments-and-metrics.md) [cte]: https://www.metabase.com/learn/sql-questions/sql-cte [models]: ../../data-modeling/models.md