根据连接条件从其他表更新日期-1

时间:2016-08-15 08:35:29

标签: sql oracle

我有两个表帐户和交易。 帐户有一个名为“creation_date”的列,而事务的列名称为“value_date”。事务表有一个列account_id(Account的主键)。

我想将Account的所有creation_date更新为Transaction表的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以获取上述记录。

2 个答案:

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

答案 1 :(得分: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