【问题标题】:Need help in updating table based on the values from another table using ORACLE SQL在使用 ORACLE SQL 根据另一个表中的值更新表时需要帮助
【发布时间】:2016-01-07 16:05:27
【问题描述】:

表 A (ID,AMT), 表 B(ID、数量)

我需要将 A.AMT 与 B.QTY 相乘并更新表 A 上的这些值。A 和 B 中的 ID 列相等。这是我创建的查询:

UPDATE A
SET A.AMT = 
   (SELECT A.AMT * B.QTY AS A
             FROM B JOIN A
                    ON
                 A.ID=B.ID)
           WHERE EXISTS
          (SELECT A.AMT * B.QTY AS A
               FROM B JOIN A
                    ON
                A.ID=B.ID)

执行时返回错误:单行子查询返回多行。

有人可以帮我解决这个问题。

【问题讨论】:

    标签: sql oracle join sql-update


    【解决方案1】:

    对于初学者来说,一遍又一遍地重复使用相同的表名而不使用别名是很难看透的。它也可能使您感到困惑。所以我会尝试分解它。从您现有的声明开始:

    UPDATE A
    SET A.AMT =   (SELECT A.AMT * B.QTY AS A
                     FROM B 
                        JOIN A ON A.ID=B.ID)
    

    您正在对每个匹配的 A/B 对设置 a.amount = 计算,因为您无法确保此查询与您正在更新的行的 ID 相关!这就是您的错误的来源。而是:

    UPDATE A a1
    SET a1.AMT =   (SELECT A2.AMT * B.QTY AS tot_amt
                      FROM B 
                        JOIN A A2 ON A2.ID=B.ID
                          WHERE a2.ID = a1.ID) -- link back to the ID of the row we are updating!
    

    好的,现在我们可以在此更新的匹配 B 行的检查中重新添加,在这种情况下,我们可以避免重新加入 A,因为它是不必要的,只需使用我们正在处理的记录

    UPDATE A a1
    SET a1.AMT =   (SELECT A2.AMT * B.QTY AS tot_amt
                      FROM B 
                        JOIN A A2 ON A2.ID=B.ID
                          WHERE a2.ID = a1.ID) 
    WHERE EXISTS
          (SELECT 1 
               FROM B b2
               WHERE b2.ID=a1.ID)
    

    我想知道您是否不需要做更多的事情来进行空检查或零检查以使其按照您希望的方式工作以满足您的要求。

    【讨论】:

    • 感谢 Michael 的查询,但查询仍然返回相同的错误:“单行子查询返回多于一行”。有什么线索吗?
    • 这是我上工作查询:UPDATE RA_CUSTOMER_TRX_LINES_ALL_WD A1 SET a1.EXTENDED_AMOUNT =(SELECT a2.EXTENDED_AMOUNT * NVL(ra_cust_trx_line_salesreps_WD.revenue_percent_split,100)/ 100 AS EXT_AMOUNT FROM ra_cust_trx_line_salesreps_WD JOIN RA_CUSTOMER_TRX_LINES_ALL_WD A2 ON a2.customer_trx_line_id = ra_cust_trx_line_salesreps_WD.customer_trx_line_id 其中 a2.customer_trx_line_id = a1.customer_trx_line_id) 存在的位置(从 ra_cust_trx_line_salesreps_WD b2 中选择 1,其中 b2.customer_trx_line_id = a1.customer_trx_line_id);
    • 这样子查询至少返回一个 a1 记录的多个值,这应该可以通过运行来证明: select customer_trx_line_id, count(1) from RA_CUSTOMER_TRX_LINES_ALL_WD group by customer_trx_line_id with count(1) > 1获取有问题的 line_ids。
    • 一旦你找到了有问题的数据,问题就变成了它是坏数据吗?或者,如果它是好的数据,那么如何修改子查询以将正确的值作为单行返回。您必须根据如何计算一组收入拆分记录的总数的业务规则来计算出这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2022-01-12
    • 2016-04-27
    相关资源
    最近更新 更多