update与delete多表联接问题

转载 2016年06月01日 22:14:58
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

相关文章推荐

UPDATE,DELETE多表操作

update b set memo = a.name from a,b where a.id = b.id   ------------------------------------...

Mysql跨表更新,删除 多表update,delete

1.多表更新       假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price;另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段P...

oracle update 多表级联更新

oracle多表级联更新    1.语法     update tableA  a set a.col1=(select b.col1 from tableB b where b.col2=a.co...

oracle数据库:update更新多表总结

总体原则:1)更新的时候一定要加where条件,否则必然引起该字段的所有记录更新                    2)跨表更新时,set和where时,尽量减少扫描次数,从而提高优化 ...

两表(多表)关联update

两表(多表)关联update -- 仅在where字句中的连接     --这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别     update customers    a&...

MySQL中Update、select联用操作单表、多表,及视图与临时表的区别

一、MySQL中使用从表A中取出数据来更新表B的内容: 例如:要update表data中的一些列属性,但是修改属性的内容来源是来自表chanpin。SQL语言中不要显示的出现select关键字 u...

MYSQL中delete删除多表数据[转]

MYSQL中delete删除多表数据[转] 前些时间已经谈过delete的删除多表数据的问题了。不过认识的不是太深刻,今天进一步查证了一些资料,终于对DELETE删除多表数据有了进一步的了解。 ...
  • sqcfj
  • sqcfj
  • 2011-11-25 17:52
  • 428

MYSQL中delete删除多表数据与删除关联数据

在mysql中删除数据方法有很多种,最常用的是使用delete来删除记录,下面我来介绍delete删除单条记 录与删除多表关联数据的一些简单实例。1、delete from t1 where 条件2、...

delete 多表删除的使用(连表删除)

delete 多表删除的使用 1、从数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉 DELETE t1 FROM t1,t2 WHERE t1.id=t2.id ...

hibernate delete update 失效问题

最近在搭建一个springmvc+hibernate+spring框架的时候,花了一个多月,一开始只是注重实现功能,根本没在意代码的简洁性和优化。后面优化代码的时候,发现hibernate的Sessi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)