Jslfl【软件开发技术笔记】

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.