Oracle数据库中2张表T_1和表T_2,T_1信息需要根据T_2表信息进行批量变更,2张表根据ID进行关联。
1.创建2张表,没有设置主键create table T_1
(
ID NUMBER(2),
YEAR VARCHAR2(20),
MONTH VARCHAR2(10)
);
create table T_2
(
ID NUMBER(2),
YEAR VARCHAR2(20),
MONTH VARCHAR2(10)
);
2.为T_1表、T_2表插入数据insert into T_1 (ID, YEAR, MONTH)values (1, '2011', '1');
insert into T_1 (ID, YEAR, MONTH)values (2, '2011', '2');
insert into T_1 (ID, YEAR, MONTH)values (3, '2011', '3');
commit;
insert into T_2 (ID, YEAR, MONTH)values (1, '2010', '11');
insert into T_2 (ID, YEAR, MONTH)values (2, '2010', '12');
commit;
3.删除表数据delete from T_1;
delete from t_2;
commit;
4.希望用t_2表的数据更新t_1表的数据,前提是2个表的id
方法一:
update t_1 a set (a.year,a.month) =(select b.year,b.month from T_2 b where b.id=a.id);
commit;
执行结果结果:
1 2010 11
2 2010 12
3
执行结果会将t_1.id =3的year,month置为空,因为这个语句是对t_1表记录进行全量变更,如果在T_2表中不存在记录则会对T_1表记录置空;
处理方法:如果不想得到这样的结果,需要增加一个where条件。
update t_1 a set (a.year,a.month) =(select b.year,b.month from T_2 b where b.id=a.id)
where a.id=(select c.id from year4 c where a.id=c.id);
commit;
执行结果:
1 2010 11
2 2010 12
3 2011 3
方法二:where条件使用exists
update t_1 a set (a.year,a.month) =(select b.year,b.month from T_2 b where b.id=a.id)
where exists (select 1 from T_2 b where b.id=a.id)
commit;
执行结果:
同方法一。
方法三:游标
declare
cursor target_cur is select year,month,id from t_2;
begin
for my_cur in target_cur loop
update t_1 set year=my_cur.year,month=my_cur.month
where id=my_cur.id;
end loop;
end;
执行结果:
执行结果:同方法一。
方法四:
update (select a.year aYear,a.id aId,a.month aMonth,b.year bYear,b.id bId,b.month bMonth from t_1 a,t_2 b where a.id = b.id) set aYear = bYear,aMonth = bMonth;
commit;
执行结果:
报oracle错误ora-01779,无法修改于非键值保存表对应列。
处理方法:将2个表的id设置为各自表的主键,然后再次执行后得到正确结果。
alter table T_1 add constraint t1_key_id primary key (ID);
alter table T_2 add constraint t2_key_id primary key (ID);
分享到:
相关推荐
多表更新SQL是指在一个SQL语句中同时更新多个表中的数据。这种技术主要用于处理那些具有紧密关联关系的数据表,比如一对多或多对多的关系。相比于逐一更新每个表,多表更新可以极大地提高效率并简化操作流程。 ####...
哈希连接中,优化器根据统计信息,首先选择两个表中的小表,在内存中建立这张表的基于连接键的哈希表;然后扫描大表,将大表中的数据与哈希表进行比较,如果有相关联则返回结果。 选择合适的连接方式取决于具体的...
综上所述,Oracle & SQL 是一个功能强大的数据库管理系统,其基础知识涵盖了数据类型、查询、命令分类以及各种高级特性,如事务处理、视图、索引等。掌握这些知识对于有效地管理和操作Oracle数据库至关重要。
- `UPDATE`:更新表中已有记录,如`UPDATE table SET column = value WHERE condition`。 - `DELETE`:删除表中的记录,如`DELETE FROM table WHERE condition`。 4. **DCL(数据控制语言)**:主要用于管理...
- **比较数据**: 使用SQL查询或其他工具来比较两个数据库中的数据是否一致。 - **修复错误**: 如果发现任何差异,需要及时修复这些错误。 #### 三. 建立转换 **3.1 创建‘转换’(GET—ORACLE-TABLES)** 1. **...
文件描述了SALES、CUSTOMERS、PRODUCTS和TIMES这四张表之间的关系,其中SALES表的PROD_ID、CUST_ID和TIME_ID分别作为外键关联到PRODUCTS、CUSTOMERS和TIMES表。接着提到了创建新表new_sales的命令,并提出了几个选项...
- `CREATE TABLE`:用于创建新的表,如在实验中创建了Student、Course、Teach和Score四个表。 - `ALTER TABLE`:用于修改已存在的表结构,例如添加、删除或修改列,或更改列的约束条件。 - `DROP INDEX`:删除已...
根据给定文件的信息,我们可以总结出一系列与Oracle SQL语句相关的知识点。这些知识点涉及了基本的...这些示例涵盖了从基础的数据操作到复杂的多表关联查询等多个方面,可以帮助用户更好地理解和掌握Oracle SQL语言。
### SQL优化Part2:深入探讨Oracle SQL性能提升技巧 #### 一、选择最有效率的表名顺序(基于规则的优化器中有效) 在Oracle数据库中,查询优化器的处理方式对于SQL语句的执行效率有着重要影响。当使用基于规则的...
15. **现在e盘下有一个test.sql文件(里面有很多对数据库的操作),请问怎样在控制台运行这个sql文件?** - 在SQL*Plus中执行脚本文件的方法:`@E:\test.sql` 16. **Oracle中的权限有哪两种?** - Oracle中的权限...
如果删除的表与其他表有相关联的数据,而这些关联数据未被删除,可以编写SQL语句,根据关联字段从其他表中提取数据,再插入到已删除的表中。 4. **创建备份表恢复** 使用`CREATE TABLE AS SELECT`语句,可以将...
TPC-H模型中定义了8张表以及22个复杂查询和2个更新操作。根据不同的数据量级别(从1GB至10000GB),测试者可以选择合适的规模来进行测试。测试过程中,查询流和更新流会并发执行数据库访问操作。其中,Power测试包含...
设计了五张表,包括地区信息表、认识途径信息表、职位信息表、行业信息表和人脉资源信息表,其中前四张表与人脉资源信息表形成一对一对应关系,体现了高范式设计,有利于数据的一致性和完整性。 在数据库设计中,...
10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: select * from a left ...
此外,对于中国的四个直辖市(北京、上海、天津和重庆),脚本特别处理,将其作为三级机构,这在实际应用中是非常实用的,因为它能够提供更加精细化的地理位置服务。 首先,让我们深入理解一下“三级地址库”的概念...
8. **数据库设计**:在数据库层面,教师信息可能被设计为一张或多张表,包括教师主表和其他关联表,如教学科目表、教师资格表等。合理的设计可以优化查询性能和数据一致性。 综上所述,"基于Java的GUI教师基本信息...
- **建立外部键**:使用FOREIGN KEY约束建立与另一个表的关联。 #### 3.5 索引 - **建立索引**:使用CREATE INDEX语句提高查询效率。 - **修改索引**:使用ALTER INDEX语句更改索引的属性。 - **删除索引**:使用...
#### 一、查询员工ENAME的第三个字母是A的员工的信息(使用2个函数) - **知识点解析**: - `upper` 函数:用于将输入的字符串转换为大写。 - `||` 运算符:用于连接两个字符串。 - `like` 关键字:用于模式匹配...