【第22期】观点:IT 行业加班,到底有没有价值?

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

举报

相关文章推荐

SQl优化问题4

一、问题的提出  在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增...

Oralce数据库的优化(面试必问题)

Oralce数据库的优化<span style="font-family: Times New Ro

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

oracle多表联合查询,统计查询,组函数,order by,having,子查询,集合运算

一、多表联合查询 通过连接可以建立多表查询,多表查询的数据可以来自多个表,但是表之间必须有适当的连接条件。为了从多张表中查询,必须识别连接多张表的公共列。一般是在WHERE子句中用比较运算符指明连...

在客户端处理Oracle的数据行加锁问题(select for update)

数据的完整性和并发性:    在网络数据库处理数据中,需要保证数据的完整性、多事务的并发性和数据的一致性。数据库系统必须最大限度的保证数据内容的有效性和合理性,使得数据合法与合理,即保证数据的完整性。而网络(多用户)数据库应用系统中,通常都会遇到多个事务同时请求修改同一数据。数据库的并发性处理保证数...

oracle多表联合查询,统计查询,组函数,排序(order by),分组过滤(having分组完后再统计),子查询,集合运算

一、多表联合查询 通过连接可以建立多表查询,多表查询的数据可以来自多个表,但是表之间必须有适当的连接条件。为了从多张表中查询,必须识别连接多张表的公共列。一般是在WHERE子句中用比较运算符指明连接...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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