update多表关联
一、Mysql
1 2 | UPDATE table1 t1 INNER JOIN table2 t2 ON t1.id=t2.id SET t1.name=t2.namestr,t1.addr=t2.addr; |
inner/left/right JOIN 都行
二、Oracle
转自:http://blog.csdn.net/leeboy_wang/article/details/8099942
Oracle没有update from语法,可以通过两种实现方式:
1、利用子查询:
1 2 3 4 | UPDATE A SET 字段1=(SELECT 字段表达式 FROM B WHERE ...), 字段2=(SELECT 字段表达式 FROM B WHERE ...) WHERE 逻辑表达式 |
UPDATE多个字段两种写法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 写法一: UPDATE table_1 a SET col_x1 = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m), col_x2 = (SELECT b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m) WHERE EXISTS (SELECT * FROM table_2 b WHERE b.col_n = a.col_m) 或 UPDATE table_1 a SET col_x1 = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m), col_x2 = (SELECT b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m) WHERE a.col_m=(SELECT b.col_n FROM table_2 b WHERE b.col_n = a.col_m) 写法二: UPDATE table_1 a SET (col_x1, col_x2) = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m) WHERE EXISTS (SELECT * FROM table_2 b WHERE b.col_n = a.col_m); 或 UPDATE table_1 a SET (col_x1, col_x2) = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m) WHERE a.col_m=(SELECT b.col_n FROM table_2 b WHERE b.col_n = a.col_m) |
注意:
1. 对于子查询的值只能是一个唯一值,不能是多值。
2. 子查询在绝大多数情况下,最后面的where EXISTS子句是重要的,否则将得到错误的结果。且where EXISTS子句可用另一方法代替,如上。最后的子句是对a表被更新记录的限制,如无此句,对于a表中某记录,如在b表中关联不到对应的记录,则该记录被更新字段将被更新为null。where EXISTS子句就是排除对a表中该情况的记录进行更新。
2、利用视图:
1 2 | UPDATE (SELECT A.NAME ANAME,B.NAME BNAME FROM A,B WHERE A.ID=B.ID) SET ANAME=BNAME; |
注意:
1. 对于视图更新的限制:
如果视图基于多个表的连接,那么用户更新(update)视图记录的能力将受到限制。除非update只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。
另外,Oracle中的Delete的from子句也没有多表联接的功能,只能通过子查询的方式来做:
1 2 | DELETE FROM 表A WHERE EXISTS (SELECT * FROM 表B WHERE 表A.empid=表B.empid) DELETE FROM 表A WHERE 表A.empid IN (SELECT empid FROM 表B) |
Comments are currently closed.