update与delete多表联接问题

Oracle没有update from语法,没有多表联接,可以通过两种实现方式:  
1、利用子查询:
update A 
SET 字段1=(select 字段表达式 from B WHERE ...), 
字段2=(select 字段表达式 from B WHERE ...) 
WHERE 逻辑表达式 
2、 -- 方法2
MERGE  INTO  表2 
USING 表1
ON  ( 表2.A = 表1.A )     -- 条件是 A 相同
WHEN  MATCHED  THEN  UPDATE  SET  表2.C = 表1.B    -- 匹配的时候,更新

UPDATE多个字段两种写法:
方法一:
UPDATE table1 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)


  Oracle中的Delete的from子句也没有多表联接的功能,只能通过子查询的方式来做:

delete from 表A where exists (select * from 表B where 表A.empid=表B.empid)
delete from 表A where 表A.empid in (select empid from 表B)

如果是两张表的 级联删除 ,可以使用
1.用 触发器
2.建表时加关键字。比如B表某列关联A表主键列,则:
create table b (col number references a(col)  on delete cascade );
注意:
1.对于set后面 子查询的值只能是一个唯一值,不能是多值
2. 子查询在绝大多数情况下, 最后面的where EXISTS子句是重要的 ,否则将得到错误的结果。且where EXISTS子句可用另一方法代替,如上。最后的子句是对a表被更新记录的限制,如无此句,对于a表中某记录,如在b表中关联不到对应的记录,则该记录被更新字段将被更新为null。where EXISTS子句就是排除对a表中该情况的记录进行更新。
切记:数据量少的时候用IN,如果数据量特别多的话,请用 exists

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值