簡體   English   中英

Oracle SQL根據另一個表但根據日期更新列

[英]Oracle SQL Update a column based on another table but based on a date

學習SQL,請原諒我。

我有一個表,該表包含許多帳戶(和子帳戶),而另一個表則包含許多訂單,它們是從不同數據庫中獲取的自定義表。

我要執行的操作是使用訂單表中的order_val值更新帳戶表上的order_amt,但是如果該帳戶有多個訂單,我希望僅從最早的訂單日期起訂購金額。

帳戶表

Acc _Num..........Comp_Name.......Order_Amt.......Int_Id  
123456789-1.....ABC Ltd.......................................123456789  
123456789-2.....ABC Ltd.......................................123456789  
987654321-1.....Xyz Ltd.........................................987654321       
987654321-2.....Xyz Ltd.........................................987654321  

訂單表

Order_Num.....Order_Dt.....Order_Val.....Acc_num  
1......................01/01/13......£20.00...........123456789    
2......................01/01/14......£10.00...........123456789  
3......................01/01/10......£100.00..........987654321  
4......................01/01/11......£200.00..........987654321  

因此,帳戶123456789-1和2的order_amt =£20.00,而來自987654321-1&2的order_amt為£100.00。

UPDATE accounts a  
SET a.order_amt =  
(  
 SELECT order_val  
 FROM orders o  
 WHERE a.int_id = o.acc_num  
 AND EXISTS  
(  
 SELECT MIN(order_dt)  
 FROM orders oa  
 WHERE o.order_num = oa.order_num  
);

我收到一些錯誤,包括返回多行的錯誤? 誰能幫我嗎?

親切的問候

伊甸園

我認為您需要這樣的東西:

UPDATE accounts a  
SET a.order_amt =  
(  
 SELECT order_val  
 FROM orders o  
 WHERE a.int_id = o.acc_num  
 GROUP BY order_val
 HAVING order_dt = MIN(order_dt);
);

在訂單表內的account_number列上創建FK ,並使其引用accounts表的auto-increment account id

然后,如Roger所建議的那樣,對int_id列稍加修改,並對HAVING子句進行修改

UPDATE accounts a 
SET a.order_amount = 
(
    SELECT order_value
    FROM orders o 
    WHERE a.account_number = o.account_number

    GROUP BY order_value
    HAVING MIN(order_date)
)

盡管由於有多個訂單附加了相同的帳戶ID,但這不能解決返回多行的錯誤。 您將需要更具體地了解您的需求。 您是否希望所有訂單金額的平均值等於帳戶表中的訂單金額? 還是最大/最小值?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM