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