【问题标题】:Snowflake invalid identifier when performin a join执行联接时雪花无效标识符
【发布时间】:2019-10-31 01:25:49
【问题描述】:

我一直在尝试在两个不同架构中的两个不同表之间进行外部联接。我试图从表格变体中过滤掉小于 4 且大于 5 位的字符。连接最终没有使用简单的 where 子句,因此做出了这个决定。

问题是如果我不加引号,Snowflake 会说我输入了无效的标识符。但是,当我使用引号运行它时,它可以工作,但我在列 raw.stitch_heroku.spree_variants.SKU 的字段中得到值,仅命名为列名,在整个表格中!

SELECT
    analytics.dbt_lcasucci.product_category.product_description,
    'raw.stitch_heroku.spree_variants.SKU'
FROM analytics.dbt_lcasucci.product_category
LEFT JOIN (
    SELECT * FROM raw.stitch_heroku.spree_variants
    WHERE LENGTH('raw.stitch_heroku.spree_variants.SKU')<=5
      and LENGTH('raw.stitch_heroku.spree_variants.SKU')>=4
) ON 'analytics.dbt_lcasucci.product_category.product_id'
      = 'raw.stitch_heroku.spree_variants.SKU'

有没有办法解决这个问题?我很困惑,还没有在论坛上发现这个问题!

提前谢谢

【问题讨论】:

    标签: left-join outer-join snowflake-cloud-data-platform


    【解决方案1】:

    首先单引号定义一个字符串文字'this is text',其中双引号是表/列名称"this_is_a_table_name"

    在表中添加别名使 SQL 更具可读性,并且可以使用 between 减少重复长度命令,因此这应该会更好:

    SELECT pc.product_description,
        sp.SKU
    FROM analytics.dbt_lcasucci.product_category AS PC
    LEFT JOIN (
        SELECT SKU
        FROM raw.stitch_heroku.spree_variants 
        WHERE LENGTH(SKU) BETWEEN 4 AND 5
    ) AS sp
        ON pc.product_id = sp.SKU;
    

    所以我减少了子选择结果,因为您只使用了 sp 中的 sku,但鉴于您将 product_idsku 进行比较,因为您的示例存在,您不需要加入 sp。

    无效的标识符对我来说意味着某些东西的命名不正确,第一步是检查表是否存在,列的名称是否符合您的预期,JOIN x ON y 子句的列类型相同,通过:

    describe table analytics.dbt_lcasucci.product_category;
    describe table raw.stitch_heroku.spree_variants;
    

    【讨论】:

    • 通过添加别名以某种方式解决了这个问题。谢谢你。实际上潜在的问题是连接键之一是 iNT,另一个是 varchar,我需要弄清楚如何将 int 转换为 varchar 以使连接正确通过。谢谢你的提示!
    • @lcasucci 如果您知道一侧“始终”是整数/数字,您可以将其转换为 "101"::number = 101 否则 try_to_number("101") 将安全地尝试并在失败时产生null,因此不匹配。
    • 我尝试应用 to_varchar 但它告诉我“单行子查询返回不止一行雪花”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2021-12-27
    • 2021-12-11
    • 2021-04-22
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多