Однорядный подзапрос возвращает более одной строки в снежинке - PullRequest
0 голосов
/ 31 октября 2019

Однострочный подзапрос возвращает более одной строки.

Это ошибка, которую я получаю при выполнении следующего кода снежинки. Я знаю, что это из-за того, что функция 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, поскольку без этого объединение не распознает эти поля и будет просто печатать нулевые значения, даже если фактическое содержимое ячеек будет совпадать.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Необходимо преобразовать выражение с несколькими значениями 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
0 голосов
/ 31 октября 2019

У вас неправильный подзапрос в предложении 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
...