Oracle SQL:使用另一个表中的数据更新表

表格1:

id name desc ----------------------- 1 a abc 2 b def 3 c adf 

表2:

 id name desc ----------------------- 1 x 123 2 y 345 

在oracle SQL中,如何运行一个sql更新查询,可以使用相同的id更新表1与表2的名称和desc? 所以我得到的最终结果是

表格1:

 id name desc ----------------------- 1 x 123 2 y 345 3 c adf 

问题是从一个表更新另一个表中的数据 ,但是专门用于oracle SQL。

这被称为相关更新

 UPDATE table1 t1 SET (name, desc) = (SELECT t2.name, t2.desc FROM table2 t2 WHERE t1.id = t2.id) WHERE EXISTS ( SELECT 1 FROM table2 t2 WHERE t1.id = t2.id ) 

假设连接的结果保存在一个键保存的视图,你也可以

 UPDATE (SELECT t1.id, t1.name name1, t1.desc desc1, t2.name name2, t2.desc desc2 FROM table1 t1, table2 t2 WHERE t1.id = t2.id) SET name1 = name2, desc1 = desc2 

尝试这个:

 MERGE INTO table1 t1 USING ( -- For more complicated queries you can use WITH clause here SELECT * FROM table2 )t2 ON(t1.id = t2.id) WHEN MATCHED THEN UPDATE SET t1.name = t2.name, t1.desc = t2.desc; 

尝试

 UPDATE Table1 T1 SET T1.name = (SELECT T2.name FROM Table2 T2 WHERE T2.id = T1.id), T1.desc = (SELECT T2.desc FROM Table2 T2 WHERE T2.id = T1.id) WHERE T1.id IN (SELECT T2.id FROM Table2 T2 WHERE T2.id = T1.id); 

在'in'子句中,这似乎是一个更好的答案,允许连接的多个键

 update fp_active set STATE='E', LAST_DATE_MAJ = sysdate where (client,code) in (select (client,code) from fp_detail where valid = 1) ... 

完整的例子在这里: http : //forums.devshed.com/oracle-development-96/how-to-update-from-two-tables-195893.html

牛肉是在你想用的列作为'in'之前的where子句中的括号中的键,并且在括号中具有相同列名的select语句。 where( column1,column2 )in( select( column1,column2 )from table where“set I want” );

 Update table set column = (select...) 

从来没有为我工作,因为设置只期望1值 – SQL错误:ORA-01427:单行子查询返回多个行。

解决scheme如下:

 BEGIN For i in (select id, name, desc from table1) LOOP Update table2 set name = i.name, desc = i.desc where id = i.id; END LOOP; END; 

这就是你在SQLDeveloper工作表上运行的方式。 他们说这很慢,但这是唯一能解决这个案子的解决办法。

如果你的表t1和它的备份t2有很多列,这里有一个紧凑的方法来做到这一点。

另外,我的相关问题是只有一些列被修改,许多行没有对这些列进行编辑,所以我想让这些独立 – 基本上从整个表的备份中恢复列的子集。 如果您只想恢复所有行,请跳过where子句。

当然,更简单的方法是删除和插入select,但在我的情况下,我只需要一个解决scheme,只是更新。

诀窍是当你从一对具有重复列名的表中select*时,第二个将被命名为_1。 所以这就是我想到的:

  update ( select * from t1 join t2 on t2.id = t1.id where id in ( select id from ( select id, col1, col2, ... from t2 minus select id, col1, col2, ... from t1 ) ) ) set col1=col1_1, col2=col2_1, ... 
 BEGIN For i in (select id, name, desc from table2) LOOP Update table1 set name = i.name, desc = i.desc where id = i.id and (name is null or desc is null); END LOOP; END;