#sql #jinja2 #snowflake-cloud-data-platform #dbt
Вопрос:
Я работаю с N таблицами на складе снежинок, где N будет расти сколь угодно долго сверхурочно.
Я создаю инструкцию SQL динамически на основе списка таблиц, сценарий SQL выглядит примерно так:
SELECT * FROM table_1
UNION ALL
SELECT * FROM table_2
UNION ALL
...
SELECT * FROM table_n;
Проблема в том, что список таблиц сам по себе задается динамически, и некоторые таблицы могут не существовать. В случае, если таблица не существует, я хочу просто проигнорировать ее в своем заявлении select. Так что что-то вроде:
SELECT * FROM table_1 IF EXISTS table_1
UNION ALL
SELECT * FROM table_2 IF EXISTS table_2
UNION ALL
...
SELECT * FROM table_n IF EXISTS table_n;
Кто-нибудь знает, возможно ли такое поведение в SQL / Snowflake?
Для записи я использую систему шаблонов dbt для обхода каждой таблицы и объединения их в одну таблицу.
Комментарии:
1. Я новичок в SQL — есть ли шанс, что вы сможете дать развернутый ответ?
2. Выполните цикл по всей схеме в базе данных с помощью операторов show, например (показать таблицы в схеме <имя_бд>. <Имя схемы>. У вас будет список таблиц из него, и вы введете этот список в свой скрипт.
Ответ №1:
Чтобы проверить, существует ли таблица в базе данных, вам необходимо использовать инструкцию SELECT в файле information_schema.tables.
Я думаю, что что-то подобное должно сработать, dbt
но я не проверял это.
{% for table_name in run_query("select table_name from information_schema.tables where table_name in ('my', 'list', 'of', 'n', 'tables')").rows %}
{% if not loop.first %}
UNION ALL
{% endif %}
SELECT * FROM table_name
{% endif -%}
{% endfor %}
Поскольку вы сказали, что вы новичок в SQL, это похоже на путь к боли. Вам нужно будет гарантировать, что все таблицы в вашей последней таблице имеют одинаковые схемы. Набор результатов может быть очень большим в зависимости от количества строк в таблицах. Вы также сказали «присоединиться», что означает что-то особенное в SQL, когда кажется, что вы имели в виду объединение