【问题标题】:Invalid operation: subquery must return only one column — Amazon Redshift无效操作:子查询必须只返回一列 — Amazon Redshift
【发布时间】:2019-11-10 11:54:56
【问题描述】:

我已经用 wat o/p 粘贴了一张图片,希望对你有帮助

我正在尝试计算单个行占某一特定列的百分比。

我可以在带有别名的SELECT 语句中实现它,但是我在导出其他列的per 列的帮助下进行了进一步的计算,所以我需要在UPDATE 查询中使用它。我尝试了以下查询,但出现错误:

无效操作:子查询必须只返回一列

我没有任何唯一 ID。我不能在其中使用IN 语句。

我哪里错了?

UPDATE a
SET per = (SELECT DISTINCT
             code,
             p,
             pd,
             ratio_to_report(SUM(amnt)) OVER (PARTITION BY p) AS per
           FROM a 
           GROUP BY code,p,pd
           )
WHERE per IS null;

【问题讨论】:

  • 。 .我删除了不一致的数据库标签。请仅使用您正在使用的数据库进行标记。样本数据和期望的结果真的很有帮助。
  • 您不应存储从其他值中计算的值。从表中删除列 PER 并改为创建视图。否则你就是在自找这样的麻烦。
  • 您需要提供一些示例数据和预期的输出。 UPDATE with a JOIN 很可能是您要查找的内容,但是使用最少的代码 sn-p 无法解决您的问题。但是,关于您的错误,只要您有something = (select...)(select...) 部分就必须只返回单行和单列。您选择了多个列,这也将返回多行。所有这些数据如何放在一行和一列中?
  • 是的,我想我必须加入。如果我得到一些建议会很有帮助
  • 我能够在 select 语句中实现百分比值,但每列是临时的,我需要进一步使用每列进行其他计算,所以我面临着困难

标签: sql amazon-redshift


【解决方案1】:

您的子查询返回多个和多个。您需要准确地告诉 Redshift 如何将所有返回的值和行应用到正在 UPDATE'ed 的表中。

例如:

UPDATE tbl_a
SET tbl_a.per = code_sum.per
FROM tbl_a
JOIN (SELECT code
           , SUM(amnt) AS per
      FROM tbl_a
      GROUP BY code
     ) code_sum
   ON tbl_a.code = code_sum.code
WHERE per IS NULL
;

旁注:为获得最佳查询速度,请勿在查询中添加 DISTINCT,除非您知道需要不同的结果。您要求 Redshift 执行一个不必要的额外操作,因为您在同一列上已经有一个 GROUP BY。 Redshift 通常能够跳过额外的DISTINCT 步骤,但并非总是如此。

【讨论】:

    【解决方案2】:

    您正在尝试用 4 个值更新 1 列。想象一下没有子查询:

    UPDATE a
    SET per = code, p, pd, per
    WHERE per IS null;
    

    您的子查询必须返回单列和单行。

    【讨论】:

    • 我尝试用单列更新它,但仍然不成功
    猜你喜欢
    • 1970-01-01
    • 2013-11-08
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多