我有两个表帐户和交易。 帐户有一个名为“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以获取上述记录。
答案 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
。