Oracle中双表关联更新的常用方案

方案一:

  • 关联更新方案必须加exists 实现
    UPDATE T2  SET T2.C =  (SELECT B FROM T1 WHERE T1.A = T2.A)  WHERE EXISTS (SELECT 1 FROM T1 WHERE T1.A = T2.A)

方案二:

  • 使用MERGE实现类似功能
    MERGE INTO T2
    USING T1
    ON (T2.A = T1.A)
    WHEN MATCHED THEN
    UPDATE SET T2.C = T1.B

方案三:

如果你想根据 A 表中的 name 字段来更新 B 表中的 status 字段,可以使用以下 SQL 语句:
注意Oracle中的in操作最大支持1000

UPDATE B
SET status = 'Updated'
WHERE a_id IN (
    SELECT id
    FROM A
    WHERE name = 'SomeName'
);

关于MERGE语法使用问题

在 Oracle 中,MERGE 语句用于将一个表的数据合并到另一个表中。它通常用于根据某些条件更新目标表中的记录,或者在没有匹配的情况下插入新记录。WHEN MATCHED 子句用于定义在目标表中找到匹配记录时要执行的操作。

语法结构

以下是 MERGE 语句的基本语法结构:

MERGE INTO target_table t
USING source_table s
ON (t.key_column = s.key_column)
WHEN MATCHED THEN
    UPDATE SET t.column1 = s.value1,
               t.column2 = s.value2
WHEN NOT MATCHED THEN
    INSERT (t.column1, t.column2)
    VALUES (s.value1, s.value2);

示例

假设有两个表:employees(目标表)和 new_employees(源表),你想根据员工的 ID 更新 employees 表中的信息,或者如果没有匹配的记录,则插入新的员工记录。

MERGE INTO employees e
USING new_employees n
ON (e.employee_id = n.employee_id)
WHEN MATCHED THEN
    UPDATE SET e.name = n.name,
               e.salary = n.salary
WHEN NOT MATCHED THEN
    INSERT (employee_id, name, salary)
    VALUES (n.employee_id, n.name, n.salary);

匹配方式

  • WHEN MATCHED: 这个子句用于定义在目标表中找到匹配记录时要执行的操作。可以使用 AND 进行进一步的条件限制。例如:
WHEN MATCHED AND e.salary < n.salary THEN
    UPDATE SET e.salary = n.salary;
  • WHEN NOT MATCHED: 这个子句用于定义当目标表中没有找到匹配记录时要执行的插入操作。

注意事项

  • 确保在执行 MERGE 操作之前备份数据,以防止意外的数据丢失。
本作品采用《CC 协议》,转载必须注明作者和本文链接
每天一点小知识,到那都是大佬,哈哈
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!