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;