Mysql

使用 MySQL/mariaDB 中另一個表的總和值更新表

  • November 29, 2017

我試圖使用下面的查詢通過在修改ORDERS表時使O_TOTALPRICE列保持最新來更新表LINEITEM。我使用的是標準的 TPC-H 數據庫。

UPDATE ORDERS O, LINEITEM L
 SET
   O.O_TOTALPRICE = SUM(L.L_EXTENDEDPRICE * (1 - L.L_DISCOUNT/100) * (1 + L.L_TAX/100))
 WHERE
   L.L_ORDERKEY = O.O_ORDERKEY;

但是,這會導致1111 - Invalid use of group function.


操作是這樣的:

-----------------LINEITEM----------------       ---------ORDERS---------
L_ORDERKEY  L_EXTPRICE  L_DISCOUNT  L_TAX       O_ORDERKEY  O_TOTALPRICE
==========  ==========  ==========  =====       ==========  ============
1           12.99       20          8.5     ┬   1           <TO CALC>
1           8.99        30          11      ┘
2           99.99       10          10      ┬   2           <TO CALC>
2           49.99       0           8.5     ┤
2           3.99        50          14.7    ┘

LINEITEM由於 中的記錄對應的有多行ORDERS,所以我嘗試添加GROUP BY L.L_ORDERKEY,但這只是語法錯誤。

這可以在UPDATE語句中完成,還是必須拆分為多個語句?謝謝!!

假設:

  • L.L_EXTENDEDPRICE應該L.L_EXTPRICE
  • L_DISCOUNTL_TAX是百分比,在這種情況下,儲存的值LINEITEM需要先除以 100.0,然後再進行計算

一些樣本數據:

drop table if exists LINEITEM;
drop table if exists ORDERS;

create table ORDERS
(O_ORDERKEY      int
,O_TOTALPRICE    decimal(10,2));

insert into ORDERS values
(1,0.0),
(2,0.0);

create table LINEITEM
(L_ORDERKEY      int
,L_EXTPRICE      decimal(10,2)
,L_DISCOUNT      decimal(10,2)
,L_TAX           decimal(10,2));

insert into LINEITEM values
(1,12.99,20, 8.5),
(1, 8.99,30,11),
(2,99.99,10,10),
(2,49.99, 0, 8.5),
(2, 3.99,50,14.7);

更新ORDERS 的內容:

select * from ORDERS;

O_ORDERKEY  O_TOTALPRICE
----------  ------------
        1          0.00
        2          0.00

建議的更新聲明:

update ORDERS O
set    O.O_TOTALPRICE  = (select sum(L.L_EXTPRICE * (1 - L.L_DISCOUNT/100.0) * (1 + L.L_TAX/100.0))
                        from   LINEITEM L
                        where  L.L_ORDERKEY = O.O_ORDERKEY);

更新ORDERS 的內容:

select * from ORDERS;

O_ORDERKEY  O_TOTALPRICE
----------  ------------
        1         18.26
        2        155.52

這是上面的rextester小提琴

引用自:https://dba.stackexchange.com/questions/191945