SQL / Снежинка — Выберите, существует ли таблица

#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, когда кажется, что вы имели в виду объединение