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

SAS:Freq过程介绍

Freq过程介绍   原文地址:http://www2.sas.com/proceedings/sugi31/252-31.pdf 转载请注明出处: http://blog.sina.com.c...

SQL利用Case When Then多条件判断

CASE     WHEN 条件1 THEN 结果1     WHEN 条件2 THEN 结果2     WHEN 条件3 THEN 结果3     WHEN 条件4 THEN 结果4 ..........
  • azhegps
  • azhegps
  • 2017年06月26日 13:57
  • 214

UPDATE,DELETE多表操作

update b set memo = a.name from a,b where a.id = b.id   ------------------------------------...
  • wawa_yu
  • wawa_yu
  • 2011年09月16日 16:52
  • 85

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

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

Update语句更新多表时在SQL Server,Oracle,MySQL三种数据库中的用法

在 MySQL 3.23 中,你可以使用 LIMIT # 来确保只有给定的记录行数目被更改。  如果一个 ORDER BY 子句被使用(从 MySQL 4.0.0 开始支持),记录行将以指定的次...

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时,尽量减少扫描次数,从而提高优化 ...

hibernate delete update 失效问题

最近在搭建一个springmvc+hibernate+spring框架的时候,花了一个多月,一开始只是注重实现功能,根本没在意代码的简洁性和优化。后面优化代码的时候,发现hibernate的Sessi...

两表(多表)关联update

两表(多表)关联update -- 仅在where字句中的连接     --这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别     update customers    a      ...
  • thy822
  • thy822
  • 2011年05月10日 14:21
  • 450

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

一、MySQL中使用从表A中取出数据来更新表B的内容: 例如:要update表data中的一些列属性,但是修改属性的内容来源是来自表chanpin。SQL语言中不要显示的出现select关键字 u...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:update与delete多表联接问题
举报原因:
原因补充:

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