Oracle SQL基于另一个表但基于日期

时间:2015-05-29 22:56:02

标签: sql oracle

学习SQL所以请原谅我。

我有一个包含许多帐户(和子帐户)的表和另一个包含许多订单的表,它们是从不同数据库中获取的自定义表。

我要做的是使用orders表中的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 =£20.00和987654321-1& 2将是100英镑。

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

我收到一些错误,包括多行返回的错误?有人可以帮帮我吗?

亲切的问候

伊甸园

2 个答案:

答案 0 :(得分: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);
);

答案 1 :(得分:0)

在订单表内的account_number列上创建 FK ,并让它引用auto-increment account id表的accounts

然后正如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。您需要更具体地了解您的需求。您是否希望所有订单金额的平均值等于帐户表中的订单值?或者可能是MAX / MIN值?