【问题标题】:SQL / Snowflake - Select if Table ExistsSQL / Snowflake - 如果表存在则选择
【发布时间】:2021-08-14 21:32:59
【问题描述】:

我正在使用 Snowflake 仓库中的 N 个表,其中 N 会随着时间的推移而任意增长。

我正在根据表列表动态创建 SQL 语句,SQL 脚本类似于:

SELECT * FROM table_1
UNION ALL
SELECT * FROM table_2
UNION ALL
...
SELECT * FROM table_n;

问题是表列表本身是动态设置的,有些表可能不存在。如果表不存在,我想在我的选择语句中简单地忽略它。所以像:

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 循环每个表并将它们连接到一个表中。

【问题讨论】:

  • 我是 SQL 的初学者 - 你有机会提供扩展答案吗?
  • 使用 show 语句遍历数据库中的所有模式,例如(在模式 . 中显示表。您将获得其中的表列表并将此列表输入到您的脚本中。

标签: sql jinja2 snowflake-cloud-data-platform dbt


【解决方案1】:

要检查数据库中是否存在表,您需要在 information_schema.tables 上使用 SELECT 语句。

我认为这样的事情应该在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 中的某些特定内容,而您的意思似乎是联合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多