单行子查询returns雪花多行

Single-row subquery returns more than one row in snowflake

单行子查询returns多行

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

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 的 table 的数据类型从 int 更改为 varchar,因为如果不这样做,连接将无法识别这些字段并且只会打印空值,即使实际单元格的内容将匹配。

您在 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

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

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

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

使用任意聚合函数,如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