如何借助 Oracle 中的第三张表将数据从源表更新到目标表?

Posted

技术标签:

【中文标题】如何借助 Oracle 中的第三张表将数据从源表更新到目标表?【英文标题】:How to update data from source table to Destination table with the help of third table in Oracle? 【发布时间】:2016-01-05 14:04:28 【问题描述】:

我正在尝试将数据从 table3(源表)更新到不存在直接关系的 table1(目标表)。我必须在另一个映射表 table2 的帮助下完成。让我放下表结构: enter image description here

我将逻辑以查询的形式放在这里。我知道语法可能是错误的。请提出建议并给出您的建议。谢谢

示例查询(仅用于理解逻辑):

UPDATE table1 destTab
SET (destTab.fname, destTab.lname) =
    (
        SELECT sourceTab.fname, sourceTab.lname
        FROM table3 sourceTab
        WHERE
            sourceTab.KEY = table2.KEY AND
            destTab.ID = table2.ID
    );

我们可以在单个查询中实现此要求还是我需要编写脚本?请提出建议并给出您的建议。谢谢

【问题讨论】:

提供示例数据和预期输出可能会有所帮助。 请在上面的“在此处输入图像描述”超链接中找到表结构的示例快照。 【参考方案1】:

您可以在oracle中使用临时表的概念,这是一种模块化且易于理解的方法。

create global temporary table TEMP1(
ID VARCHAR2(50), KEY VARCHAR2(50))
ON COMMIT DELETE ROWS;

create global temporary table TEMP2(
KEY VARCHAR2(50), FNAME VARCHAR2(100), LNAME VARCHAR2(100))
ON COMMIT DELETE ROWS;

create global temporary table TEMP3(
ID VARCHAR2(50), FNAME VARCHAR2(100), LNAME VARCHAR2(100))
ON COMMIT DELETE ROWS;  

BEGIN
INSERT INTO TEMP1 (ID, KEY)
(select TABLE1.ID, TABLE2.KEY 
from TABLE1, TABLE2 
where TABLE1.ID = TABLE2.ID

INSERT INTO TEMP2(KEY, FINAME, LNAME)
(SELECT ID, FNAME,LNAME
FROM TABLE3
WHERE TABLE3.KEY IN (SELECT KEY FROM TEMP1)); 

INSERT INTO TEMP3(ID, FNAME, LNAME)
(SELECT TEMP1.ID, TEMP2.FNAME, T2.LNAME 
FROM TEMP1, TEMP2 
WHERE TEMP1.KEY = TEMP2.KEY);

UPDATE TABLE1
SET (TABLE1.FNAME, TABLE1.LNAME) = (SELECT FNAME, LNAME FROM TEMP3
WHERE TEMP3.ID = TABLE1.ID);
commit; 
END

【讨论】:

【参考方案2】:

Oracle 提供了这样的解决方案 =>

UPDATE 
    (SELECT table1.value as OLD, table2.CODE as NEW
     FROM table1
     INNER JOIN table2
     ON table1.value = table2.DESC
    ) t
SET t.OLD = t.NEW

(这取决于 Oracle 是否认为内联视图可更新)。

所以你可以试试这个查询:

 UPDATE
    (  select t1.fname_old
            , t1.lname_old
            , t3.fname_new
            , t3.lname_new
        from table1 t1
        join table2 t2 on t1.id = t2.id
        join table3 t3 on t2.key and t3.key 
    ) T
    SET T.fname_old = T.fname_new
      , T.lname_old = T.lname_new
    ;

【讨论】:

非常感谢您的快速回复。一定会尝试!

以上是关于如何借助 Oracle 中的第三张表将数据从源表更新到目标表?的主要内容,如果未能解决你的问题,请参考以下文章

如何从第三张表中的两个不同表中制作外键?

oracle 想把三张表关联起来,怎么关联?

ORACLE中如何多表关联查询。如有A、B、C三张表,A表字段a和B表字段b以及C表字段c关联,写出查询语句

MYSQL 三张表查询

如果ID存在于第二张或第三张表中,如何从第一张表中高效选择?

基于第三张表以雄辩的形式定义关系