2016-08-15 109 views
0

我有两个表帐户和交易。 帐户有一个名为'creation_date'的列,事务有一个列名'value_date'。交易表中有一列account_id(Account的主键)。根据连接条件从其他表更新日期-1

我想将Account的所有creation_date更新为事务表的value_date-1,其中value_date小于该特定帐户的creation_date。

该查询获取所有这样的记录:

SELECT 
a.value_date, 
b.creation_date 
FROM transaction a, 
account b 
WHERE a.account_id = b.account_id 
AND TRUNC(a.value_date) < TRUNC(b.creation_date) 

我只需要更新a.value_date到b.creation_date-1以上的记录。

回答

0

您可以使用此

UPDATE 
    transaction t 
SET 
    value_date = (
      SELECT 
       creation_date - 1 
      FROM 
       account a 
      WHERE 
       a.account_id = t.account_id 
       AND TRUNC(a.creation_date) > TRUNC(t.value_date) 
      ) 
WHERE 
    EXISTS (
     SELECT 
      1 
     FROM 
      account a 
     WHERE 
      a.account_id = t.account_id 
      AND TRUNC(a.creation_date) > TRUNC(t.value_date) 
    ); 

而且尽量不要使用OLD-STYLE-JOIN从现在开始

+0

感谢Pham,但我在查询中看不到表名。 – Sunny

+0

需要再做一次更正。它应该是t.old_date = t.new_date - 1. – Sunny

+0

thks,editted .. –

0

你可以做到这一点是:

update account a 
    set creation_date = (select min(value_date) - 1 
         from transactions t 
         where t.account_id = a.account_id and 
           trunc(t.value_date) < trunc(a.creation_date) 
         ) 
    where exists (select 1 
        from transactions t 
        where t.account_id = a.account_id and 
         trunc(t.value_date) < trunc(a.creation_date) 
       ); 

注:这考虑到了多行transactions可能对应于同一个帐户。它为此使用最小的value_date

相关问题