SQL中的多表更新及注意事项
来源:互联网 发布:蚁群优化算法 编辑:程序博客网 时间:2024/05/21 09:30
SQL中的多表更新及注意事项
在数据库开发中经常遇到要进行多表更新的情况,多表更新可以通过游标循环来实现,但是要写好多语句,不太方便,因此很多人用多表更新来实现,但是如果在使用中不注意语法的严谨性,就会产生不可挽回的失误。下面我将通过实例来进行说明。
1、在SQL SERVER 中
Create table A (c1 VARCHAR(10),c2 VARCHAR(10));
insert into a values('1','a1');
insert into a values('2','a2');
insert into a values('3','a3');
insert into a values('8','a8');
Create table B (c1 VARCHAR(10),c3 VARCHAR(10));
insert into b values('1','b1');
insert into b values('2','b2');
insert into b values('3','b3');
insert into b values('10','b10');
##多表更新 示例1
UPDATE A SET A.c2 =B.c3 from A ,B where A.c1=B.c1;
(所影响的行数为 3 行)
select * from a;
c1 c2
---------- ----------
1 b1
2 b2
3 b3
8 a8
##多表更新 示例2
update a set a.c2 = (select b.c3 from b where a.c1=b.c1);
(所影响的行数为 4 行) s
elect * from a;
c1 c2
---------- ----------
1 b1
2 b2
3 b3
8 NULL
##多表更新 示例3
update a set a.c2 = (select b.c3 from b where a.c1=b.c1) where exists (select 1 from b where a.c1=b.c1);
(所影响的行数为 3 行)
select * from a;
c1 c2
---------- ----------
1 b1
2 b2
3 b3
8 a8
2、在Oracle中
Create table A (c1 NUMBER(10),c2 VARCHAR(10),c4 NUMBER(1));
insert into a values(1,'a1',0);
insert into a values(2,'a2',2);
insert into a values(3,'a3',3);
insert into a values(8,'a8',4);
Create table B (c1 NUMBER(10),c3 VARCHAR(10));
insert into b values(1,'b1');
insert into b values(2,'b2');
insert into b values(3,'b3');
insert into b values(10,'b10');
Commit;
## 表自己对自己更新 示例4
UPDATE a d SET (d.c1) = (SELECT SUM(c.c4) FROM a c WHERE c.c4 <> 0);
4 Rows updated in 0 seconds
select * from a;
C1 C2 C4
---------- ----------
9 a1 0
9 a2 2
9 a3 3
9 a8 4
## 表自己对自己更新 示例5
UPDATE a d SET (d.c1) = (SELECT SUM(c.c4) FROM a c WHERE c.c4 <> 0) WHERE d.c4 = 0;
1 Rows updated in 0 seconds
select * from a;
C1 C2 C4
---------- ----------
9 a1 0
2 a2 2
3 a3 3
8 a8 4
## 表更新表 示例6
UPDATE A SET A.c2 =B.c3 from A ,B where A.c1=B.c1;
ORA-00933:SQL命令未正确结束
## 表更新表 示例7
update a set a.c2 = (select b.c3 from b where a.c1=b.c1);
4 Rows updated in 0 seconds
select * from a;
C1 C2 C4
---------- ----------
1 b1 0
2 b2 2
3 b3 3
8 4
## 表更新表 示例8
update a set a.c2 = (select b.c3 from b where a.c1=b.c1) where exists (select 1 from b where a.c1=b.c1);
3 Rows updated in 0 seconds
select * from a;
C1 C2 C4
---------- ----------
1 b1 0
2 b2 2
3 b3 3
8 a8 4
分析与说明: 1、SQL Server和Oracle的update语法有所区别共同点1:update后只能跟一个表共同点2:SQL Server和Oracle的update语法都可以用如下方式实现多表更新 UPDATE updatedtable SET (col_name1[,col_name2...])= (SELECT col_name1,[,col_name2...] FROM srctable [WHERE where_definition])
不同点:SQL Server的update语句中from后可跟多个表,Oracle则不支持该用法
2、示例2、示例4和示例7的用法都不严谨,缺少条件将导致无可挽回的损失正确的用法应该为示例3、5和8 请仔细对比。以上示例都是在原始数据基础上进行的,每个示例用的原始数据都相同。
- SQL中的多表更新及注意事项
- SQL关联表更新注意事项
- Petalinux BSP使用中的问题及注意事项(持续更新)
- pl sql多表插入及更新
- Mybatis多对多中的SQL(查询、删除、更新、插入)及表的设计
- Mybatis一对多中的SQL(查询、删除、更新、插入)及表的设计
- SQL优化及注意事项
- sql 语句中的注意事项
- Mybatis一对一中的SQL(查询、删除、更新、插入)及表的设计
- SQL基础及安装注意事项
- SQL语法基础及注意事项
- Mybatis动态SQL执行批量更新注意事项
- Informix中的SQL查询注意事项
- sql中更新不同库中的表
- 个人注意事项及目标(一直更新中)
- python中的列表及注意事项
- python中的字典及注意事项
- SQL-- 删除表中的记录、更新表中的记录
- jsp实现中文文件名下载
- jquery UI学习
- 浅复制和深度复制 clone()
- 带有属性的标记taglib
- 程序员心里
- SQL中的多表更新及注意事项
- SOA治理:为服务提供者和使用者搭一座桥梁
- jta 与jdbc事务
- There is insufficient memory. Save the document now.
- 跨数据库表相同结构的插入SQL语句
- 企业网安全与风险评估
- 领跑SOA IBM带您步入SOA成功之旅
- 异步委托实例
- 实现输出流转输入流