【问题标题】:Single-row subquery returns more than one row in snowflake单行子查询在雪花中返回多于一行
【发布时间】:2020-02-27 05:04:37
【问题描述】:

单行子查询返回多行。

这是我在运行以下雪花代码时遇到的错误。 我知道这是因为 TO_VARCHAR 函数不适用于整个表列。关于如何解决问题并将其应用于整个列的任何想法?

SELECT sv.SKU
       , li.price
       , li.cost_price
       , pc.product_description
FROM raw.stitch_heroku.spree_line_items as li 
LEFT OUTER JOIN (SELECT * 
                 FROM raw.stitch_heroku.spree_variants 
                 WHERE LENGTH(raw.stitch_heroku.spree_variants.SKU) Between 4 and 5) as sv
ON li.variant_id = sv.id
LEFT JOIN (SELECT analytics.dbt_lcasucci.product_category.product_description
                  , TO_VARCHAR(analytics.dbt_lcasucci.product_category.product_ID) 
           FROM analytics.dbt_lcasucci.product_category) as pc
ON (SELECT TO_VARCHAR(analytics.dbt_lcasucci.product_category.product_ID) 
    FROM analytics.dbt_lcasucci.product_category) = sv.id
GROUP BY  sv.SKU,li.price,li.cost_price,pc.product_description

我必须将名为 analytics.dbt_lcasucci.products 的表的数据类型从 int 更改为 varchar,因为如果不这样做,连接将无法识别这些字段,并且即使单元格的实际内容匹配,也只会打印空值。

【问题讨论】:

    标签: sql join types subquery snowflake-cloud-data-platform


    【解决方案1】:

    您在 ON 子句中有错误的子查询..

    SELECT sv.SKU
        , li.price
        , li.cost_price
        , pc.product_description
    FROM raw.stitch_heroku.spree_line_items as li 
    LEFT OUTER JOIN ( 
        SELECT * 
        FROM raw.stitch_heroku.spree_variants 
        WHERE LENGTH(raw.stitch_heroku.spree_variants.SKU) Between 4 and 5
    ) as sv ON li.variant_id = sv.id
    LEFT JOIN ( 
        SELECT analytics.dbt_lcasucci.product_category.product_description
        , TO_VARCHAR(analytics.dbt_lcasucci.product_category.product_ID) my_key
        FROM analytics.dbt_lcasucci.product_category 
        ) as pc  ON pc.my_key = sv.id
    

    并且没有聚合功能 .. 你不需要 group by ..如果你不想要重复的行,最终使用 distinct

    ON (SELECT TO_VARCHAR(analytics.dbt_lcasucci.product_category.product_ID) 
        FROM analytics.dbt_lcasucci.product_category) = sv.id
    

    【讨论】:

    • 谢谢!哪个子查询是错误的?我不确定你说的是哪一个。
    • 答案已更新 .. 添加对我来说似乎错误的 ON 子句
    • 您不必指定要加入的密钥吗?
    • 答案已更新 .. 为加入添加(希望)清除键
    • 查询以这种方式工作。但是,输出与我不添加 TO VARCHAR 的输出相同...其中一个列只有空值。恐怕它没有开始转型
    【解决方案2】:

    您需要将多值表达式TO_VARCHAR(analytics.dbt_lcasucci.product_category.product_ID) 转换为单值表达式。

    使用any聚合函数,如MIN()MAX()AVG()SUM()

    例如,您可以使用MAX(TO_VARCHAR(analytics.dbt_lcasucci.product_category.product_ID)),如:

    SELECT
      sv.SKU,
      li.price, 
      li.cost_price,
      pc.product_description
    FROM raw.stitch_heroku.spree_line_items as li 
    LEFT OUTER JOIN (
      SELECT * 
      FROM raw.stitch_heroku.spree_variants 
      WHERE LENGTH(raw.stitch_heroku.spree_variants.SKU) Between 4 and 5
    ) as sv ON li.variant_id = sv.id
    LEFT JOIN (
      SELECT analytics.dbt_lcasucci.product_category.product_description,
        TO_VARCHAR(analytics.dbt_lcasucci.product_category.product_ID) 
      FROM analytics.dbt_lcasucci.product_category
    ) as pc ON (
        SELECT MAX(TO_VARCHAR(analytics.dbt_lcasucci.product_category.product_ID))
        FROM analytics.dbt_lcasucci.product_category
      ) = sv.id
    GROUP BY sv.SKU, li.price, li.cost_price, pc.product_description
    

    【讨论】:

    • 谢谢!但是,我的目标是将整个列从 int 转换为 varchar 以获取名为 sv 的表。有意义吗?
    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多