sql - 如何从 select 执行 Oracle SQL 更新?

标签 sql oracle sql-update

我创建了一个查询来从另一个表更新一个表。该字段正在按给定日期的预期更新。问题是,对于其他日期,我现在在更新的列上得到 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/

相关文章:

MySQL:更新触发器。如果不匹配任何行,获取 UPDATE 的 where 子句中使用的列的值?

php - 在 php/mysql 中更新多行/多列

sql - 使用选择查询更新表

php - 我如何比较一个或两个查询的结果?

sql - Oracle REGEXP_INSTR() 和 "a-z"字符范围与预期不匹配

mysql - 如何将两个分隔列的值合并为一个?

SQL:快速累积频率查询(postgres)

Oracle直接路径插入问题

linux - Linux/Unix 中是否有一次注释掉多行的命令?

php - 不应在数据库 mysql PHP 上更新空白字段