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

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

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


person lcasucci    schedule 31.10.2019    source источник


Ответы (2)


У вас неправильный подзапрос в предложении 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
person scaisEdge    schedule 31.10.2019
comment
Спасибо! Какой подзапрос неверен? Я не уверен, о каком из двух вы говорите. - person lcasucci; 31.10.2019
comment
ответ обновлен ... добавление предложения ON, которое мне кажется неправильным - person scaisEdge; 31.10.2019
comment
разве вам не нужно указывать, на каком ключе вы присоединяетесь? - person lcasucci; 31.10.2019
comment
ответ обновлен .. добавление (надеюсь) четкого ключа для присоединения - person scaisEdge; 31.10.2019
comment
Запрос работает так. Однако результат такой же, как если бы я не добавлял TO VARCHAR ... один из столбцов имеет только нулевые значения. Боюсь, трансформация не начинается - person lcasucci; 01.11.2019
comment
я не понимаю .. ваш вопрос si не об ошибке для однострочного подзапроса возвращает более одной строки ... ???? - person scaisEdge; 01.11.2019
comment
Верный. Однако единственной причиной, по которой я добавил to varchar ко всему этому сценарию, было преобразование типа данных из int в varchar. Я задал вопрос о том, почему я получил этот подзапрос с одной строкой, но я предполагаю, что varchar не поддерживает преобразование всего столбца - person lcasucci; 01.11.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
person The Impaler    schedule 31.10.2019
comment
Спасибо! Однако моя цель - преобразовать весь столбец из int в varchar, чтобы выбрать, чтобы одно значение не выполняло то, что я пытаюсь сделать ... Я пытаюсь объединить любые значения в этом столбце со всеми значениями стол назывался св. Имеет смысл? - person lcasucci; 31.10.2019