2015-05-29 111 views
0

學習SQL,請原諒我。Oracle SQL根據其他表更新一列,但基於日期

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

我想要做的是更新order_amt在訂單表中的order_val值的帳戶表,但如果有多個訂單與該帳戶我想從最早訂單日期的訂單金額。

帳戶表

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 =£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 
); 

我收到一些錯誤,包括多行返回的錯誤?任何人都可以幫我嗎?

親切的問候

伊甸園

回答

0

我想你需要的東西是這樣的:

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); 
); 
0

在列account_number訂單表內創建一個FK,並將它引用auto-increment account idaccounts表。

然後羅傑建議,與列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。您需要更具體地瞭解您的需求。您是否希望所有訂單金額的平均值與賬戶表中的訂單金額相同?或者也許MAX/MIN值?