我创建了一个查询来从另一个表更新一个表。该字段正在按给定日期的预期更新。问题是,对于其他日期,我现在在更新的列上得到 NULL 值。如何仅为特定日期设置新值而不影响其他日期?
表A:
| ID | VALUE | ADD_TIME |
-------------------------------------
| 1 | -5 |1/11/2019 10:45:11 am |
表B:
|AS_OF_DATE| ID | VALUE |
-------------------------
|2/29/2019 | 1 | -4 |
|1/31/2019 | 1 | -4 |
|12/31/2018| 1 | -4 |
期望的输出:
|AS_OF_DATE| ID | VALUE |
-------------------------
|2/29/2019 | 1 | -4 |
|1/31/2019 | 1 | -4 |
|12/31/2018| 1 | -5 |
当前输出:
|AS_OF_DATE| ID | VALUE |
-------------------------
|2/29/2019 | 1 | |
|1/31/2019 | 1 | |
|12/31/2018| 1 | -5 |
我的查询:
update TABLEB
set VALUE =
(
select VALUE from TableA
where ID = '1'
and TABLEB.AS_OF_DATE < TABLEA.ADD_TIME
)
最佳答案
您可以添加 exists()
检查,以便不更新没有匹配的行:
update TABLEB
set VALUE =
(
select VALUE from TABLEA
where ID = '1'
and TABLEB.AS_OF_DATE < TABLEA.ADD_TIME
)
where exists
(
select VALUE from TABLEA
where ID = '1'
and TABLEB.AS_OF_DATE < TABLEA.ADD_TIME
)
1 row updated.
select * from tableb;
AS_OF_DAT ID VALUE
--------- ---------- ----------
28-FEB-19 1 -4
31-JAN-19 1 -4
31-DEC-18 1 -5
我将您的示例数据中的 2/29/2019 更改为 2/28/2019...
想必您在两个表中确实都有多个 ID,因此请关联第二列 - 而不是 WHERE ID = '1'
(可能应该是 WHERE ID = 1
) > 无论如何!)使用WHERE TABLEB.ID = TABLEA.ID
。
您还可以使用合并而不是更新,例如:
merge into tableb b
using tablea a
on (a.id = b.id and b.as_of_date < a.add_time)
when matched then update set b.value = a.value;
或
merge into tableb b
using tablea a
on (a.id = b.id)
when matched then update set b.value = a.value
where b.as_of_date < a.add_time;
关于sql - 如何从 select 执行 Oracle SQL 更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55518107/