2016-08-15 92 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