0

是否可以在不限定数据库名称的情况下运行 SQL 脚本?目前,我们正在使用如下程序,

    SELECT  I.XXXX_LOC_SKEY,
            C.COUNTRY_SKEY
    FROM
            DEV_XXXX_DB.STAGING.XX_TABLE_LOCATION_SALES         F,
            DEV_XXXX_PRESENTATION_DB.DIMS.XXXX_LOCATIONS_D      I,
            DEV_XXXX_PRESENTATION_DB.DIMS.COUNTRY_D             C,
            DEV_XXXX_PRESENTATION_DB.DIMS.XXXX_DAILY_CALENDAR_D H
    WHERE
            F.STORE_CODE       = I.DOOR
    AND     I.CHANNEL          = 'XXXX'
    AND     F.COUNTRY          = C.COUNTRY_CODE
    AND     I.COUNTRY_SKEY     = C.COUNTRY_SKEY
    AND     F.DATE = H.DATE;

我们想运行相同的脚本,但不提及数据库名称,如下所示。

    SELECT  I.XXXX_LOC_SKEY,
            C.COUNTRY_SKEY
    FROM
            STAGING.XX_TABLE_LOCATION_SALES         F,
            DIMS.XXXX_LOCATIONS_D                   I,
            DIMS.COUNTRY_D                          C,
            DIMS.XXXX_DAILY_CALENDAR_D              H
    WHERE
            F.STORE_CODE       = I.DOOR
    AND     I.CHANNEL          = 'XXXX'
    AND     F.COUNTRY          = C.COUNTRY_CODE
    AND     I.COUNTRY_SKEY     = C.COUNTRY_SKEY
    AND     F.DATE = H.DATE;
4

5 回答 5

1

虽然雪花 Web GUI 会记住您的最后一个数据库,以及其他例如。ETL 工具可以为连接配置默认数据库,Snowflake 没有默认数据库的概念。包括 Web GUI 在内的所有工具都必须发出以下命令来根据工具配置设置数据库:

USE DATABASE db_name;

如果要避免在命令中引用数据库,则必须USE DATABASE事先在会话中使用该命令。

于 2019-12-13T13:07:23.617 回答
1

这是不合格对象的解析方式:

https://docs.snowflake.net/manuals/sql-reference/name-resolution.html

请注意,您可以自定义 SEARCH_PATH 以搜索多个模式。

或者,您可以将完全限定名称放入变量中:

set f = 'DEV_XXXX_DB.STAGING.XX_TABLE_LOCATION_SALES';

select f.* from table($f) f;

select f.* from identifier($f) f;
于 2019-12-13T14:29:07.177 回答
0

如果您有许多数据库,但大部分数据来自其中一个,您可以在一个数据库中创建指向另一个数据库的视图。这样就可以在不需要数据库的情况下查询所有对象。

即 CREATE VIEW MY_VIEW as SELECT * FROM DATABASE.SCHEMA.TABLE

于 2019-12-13T18:55:50.990 回答
0

我可以看到您的 SQL 访问来自不同数据库的数据,然后您使用对象的完全限定名称运行 SQL。

如果雪花当前会话指向对象的位置,那么您可以在不限定数据库名称的情况下运行 SQL。

于 2019-12-13T07:44:51.453 回答
0

根据提供的 SQL 进行一些推断,您已将环境嵌入到数据库名称 (DEV_XXXX_DB) 中。由于每个环境有多个数据库,这会迫使您将数据库名称显式添加到每个跨数据库的 sql,正如 SimonD 指出的那样。

如果您还没有发现这一点,那么您将很难在 b/c 环境之间推广代码,因为您将不得不将 DEV_XXXX_DB 替换为 PRD_XXXX_DB。

如果您在 Snowflake 实施的过程中还没有走那么远,我建议您重新考虑您的 DB.SCHEMA 策略,并为每个环境(env_XXXX_DB)仅创建 1 个 DB,并将所有模式与该 DB(env_XXXX_DB.STAGING, env_XXXX_DB.DIMS)。

于 2019-12-13T14:18:25.037 回答