Sql 无效操作:子查询只能返回一列-Amazon红移

Sql 无效操作:子查询只能返回一列-Amazon红移,sql,amazon-redshift,Sql,Amazon Redshift,我已经贴了一张有水的照片,我需要帮助 我试图计算单个行的百分比,其中包含一个特定列的总和 我可以在别名为的SELECT语句中实现它,但在派生其他列的column per的帮助下,我还有进一步的计算,所以我需要在更新查询中使用它。我尝试了以下查询,但出现错误: 无效操作:子查询只能返回一列 我没有任何唯一的id。我不能在本文档的语句中使用 我哪里做错了 UPDATE a SET per = (SELECT DISTINCT code, p,

我已经贴了一张有水的照片,我需要帮助

我试图计算单个行的百分比,其中包含一个特定列的总和

我可以在别名为的SELECT语句中实现它,但在派生其他列的column per的帮助下,我还有进一步的计算,所以我需要在更新查询中使用它。我尝试了以下查询,但出现错误:

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

我没有任何唯一的id。我不能在本文档的语句中使用

我哪里做错了

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;

您试图用4个值更新1列。想象一下,如果没有子查询:

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

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

子查询返回多个值和多行。您需要准确地告诉Redshift如何将所有返回的值和行应用于正在更新的表

例如:

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
;

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

。我删除了不一致的数据库标记。请仅使用您正在使用的数据库进行标记。样本数据和期望的结果将非常有用。您不应该存储从其他值中计算出来的值。从表中删除每列,改为创建视图。否则,您会遇到这样的麻烦。您需要提供一些示例数据和预期输出。A很可能是您正在寻找的,但是使用最小的代码片段不可能修复您的问题。但是,关于你的错误,任何时候你有东西=选择。。。选择。。。部分只能返回一行和一列。您选择了多个列,这也将返回多行。所有这些数据如何才能放在一行和一列中?是的,我想我必须使用join。如果我得到一些关于我能够实现select语句中的百分比值的建议,将非常有帮助,但每列都是临时的,我需要使用每列进行其他计算,因此我面临着困难。我尝试使用单列更新它,但仍然没有成功