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

Sql 如何借助Oracle中的第三个表将数据从源表更新到目标表?,sql,oracle,plsql,Sql,Oracle,Plsql,我正在尝试将数据从表3(源表)更新到表1(目标表),这与数据之间没有直接关系。我必须借助另一个映射表,表2来完成这项工作。让我把桌子的结构放下来: 我把逻辑放在这里,以查询的形式。我知道语法可能是错误的。请提出建议和建议。谢谢 示例查询(仅用于理解逻辑): 我们可以在一个查询中实现这个要求,还是需要编写脚本?请提出建议和建议。谢谢Oracle提供了这样的解决方案=> UPDATE (SELECT table1.value as OLD, table2.CODE as NEW

我正在尝试将数据从表3(源表)更新到表1(目标表),这与数据之间没有直接关系。我必须借助另一个映射表,表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中使用临时表的概念,这是一种模块化且易于理解的方法

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

这可能有助于提供示例数据和预期输出。请在上面的“输入图像描述”超链接中找到表结构的示例快照。非常感谢您的快速回复。一定会试试的!
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