带子查询的SQL语句怎么实现for update

xuanyuanyilu 2010-11-29 04:50:45
有俩张表A,B,A为主表,B为子表,是1对多的关系。
需求是在A中搜出前 上限1000条 未处理 的数据和对应的子表数据,然后将主表状态改成 处理中,处理好后再将状态改成处理完成,这个过程中需要用for update来锁表。

我的sql语句思路是:

SELECT m.*,s.* FROM (
SELECT * FROM TBL_MAIN WHERE DEAL_FLAG = '0' and rownum<1001
)m

, TBL_SUB s
where m.id=s.id (for update of s.id)

括号内是我想锁表实现的地方,但由于存在子查询,所以不能锁主表,而现在这个锁子表又没什么用。
高人在哪里?

顺便说下另一种思路,就是分俩次来查,先查主表,然后根据差得的数据for循环再来查子表,这个耗费太大,实在没有办法时才考虑,暂时不采用。
...全文
490 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuanyuanyilu 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gelyon 的回复:]

你是想在过程中处理吧?
定义游标,来实现更新和锁表
如:
CURSOR cur IS
SELECT m.*,s.* FROM (
SELECT * FROM TBL_MAIN WHERE DEAL_FLAG = '0' and rownum<1001
)m
, TBL_SUB s
where m.id=s.id for update of s.id ;
....
……
[/Quote]

游标这个我真不太熟悉,不知道在IBATIS中是否可行,也不知道效率怎么样
xuanyuanyilu 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yy_mm_dd 的回复:]

引用楼主 xuanyuanyilu 的回复:
有俩张表A,B,A为主表,B为子表,是1对多的关系。
需求是在A中搜出前 上限1000条 未处理 的数据和对应的子表数据,然后将主表状态改成 处理中,处理好后再将状态改成处理完成,这个过程中需要用for update来锁表。

我的sql语句思路是:

SELECT m.*,s.* FROM (
SELECT * FROM TBL_MA……
[/Quote]

因为主表和子表是一对多的关系,所以没有可能(至少我想不出来)不用子查询然后能得到主表前1000条数据及其对应子表数据
YY_MM_DD 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 xuanyuanyilu 的回复:]
有俩张表A,B,A为主表,B为子表,是1对多的关系。
需求是在A中搜出前 上限1000条 未处理 的数据和对应的子表数据,然后将主表状态改成 处理中,处理好后再将状态改成处理完成,这个过程中需要用for update来锁表。

我的sql语句思路是:

SELECT m.*,s.* FROM (
SELECT * FROM TBL_MAIN WHERE DEAL_FLAG = '0……
[/Quote]
你可以尝试不使用子查询,直接做自然连接,然后做for update 这样可以达到锁两个表的目的,你可以尝试调整你的sql
gelyon 2010-11-29
  • 打赏
  • 举报
回复
你是想在过程中处理吧?
定义游标,来实现更新和锁表
如:
CURSOR cur IS
SELECT m.*,s.* FROM (
SELECT * FROM TBL_MAIN WHERE DEAL_FLAG = '0' and rownum<1001
)m
, TBL_SUB s
where m.id=s.id for update of s.id ;
....
....
UPDATE ...FROM ... WHERE CURRENT OF cur;
....
....
xuanyuanyilu 2010-11-29
  • 打赏
  • 举报
回复
在线等ing....高人速来
实用数据库上机作业 建立二张数据表,一张是员工信息表(Employee),一张是部门信息表(Department)。 Employee包括:员工编号(EmployeeId, int、员工姓名(EmployeeName, varchar(20))、雇佣时间(HireDate, smalldatetime)、基本工资(BaseWage, money)、部门编号(DepartmentId, char(3) Department包括:部门编号(DepartmentId, char(3)、部门名称(DepartmentName, varchar(20))、负责人(Principal, varchar(20))、平均工资(AvgWage, money, 允许空) 一. 表的设计(使用SQL语句创建数据库表,具体要求如下)  将Department中的DepartmentId设置主键  将Employee中的EmployeeId设置主键  对Employee中的EmployeeName设置唯一性约束  对Employee中的HireDate设置检查约束,要求输入的日期大于’1980-1-1’  设置两个表的外键联系 二.数据库更新语句  使用Insert语句,定义一条记录并插入到部门信息表中。  对每个部门,求员工基本工资的平均值,并将结果存入到部门信息表中的平均工资字段中。(使用update语句)  从员工信息表中删除员工编号为“10030021”的所有信息。  从员工信息表中删除部门名称为“市场部”的所有员工信息。(使用子查询的删除语句)  将所有员工的基本工资上涨10%。  将所有属于“市场部”的员工的基本工资加上100元。(使用子查询的更新语句)
基于Python的数据库课程设计-数据库系统.zip 完成度: [x] 设计特定的数据结构,用于存储数据表、视图、索引三种数据库对象的元数据信息,建立数据库系统的数据字典;{表占0.5分,视图和索引占0.5分,要有存储文件对应} [x] 设计特定的数据结构,用于存储数据表中的数据;{要有存储文件对应} [x] 设计特定的数据结构,用于存储索引数据;{要有存储文件对应} [x] 设计特定的数据结构,分别用于存储用户和访问权限的信息;{用户的数据结构占0.5分,用户包含超级管理员和普通用户;权限的数据结构占0.5分,存储某用户对某数据库对象的某种访问权限;要有对应的存储文件} [x] 输入“help database”命令,输出所有数据表、视图和索引的信息,同时显示其对象类型;输入“help table 表名”命令,输出数据表中所有属性的详细信息;输入“help view 视图名”命令,输出视图的定义语句;输入“help index 索引名”命令,输出索引的详细信息;{4个各占0.25分} [x] 解析CREATE、SELECT、INSERT、DELETE、UPDATESQL语句的内容;检查SQL语句中的语法错误和语义错误;{5个各占0.2分} [x] 执行CREATE语句,创建数据表、视图、索引三种数据库对象;创建数据表时需要包含主码、外码、唯一性约束、非空约束等完整性约束的定义;{创建数据表0.5分,视图0.3分,索引0.2分;对于create table,要支持主码、外码、unique、null和not null、check约束,约束缺失扣除0.2分} [x] 执行SELECT语句,从自主设计的数据表中查询数据,并输出结果;在SELECT语句中需要支持GROUP BY、HAVING和ORDER BY子句,需要支持5种聚集函数;{单表查询占0.4分、连接查询占0.4分、嵌套查询占0.8分、集合查询占0.4分;where语句支持and、or、between and、in、like等谓词、支持分组功能和排序功能,简单的单表查询功能仅得0.2分} (1.5分) [x] 执行INSERT、DELETE和UPDATE语句,更新数据表的内容;更新过程中需要检查更新后的数据表是否会违反参照完整性约束。如果是,则提示违反哪一条完整性约束,并拒绝执行更新操作;如果否,提示数据表更新成功,并说明插入、删除或修改了几个元组。{insert语句占0.4分,update语句占0.4分,delete语句占0.2分,insert要实现单个元组的插入和元组集合的插入(子查询),要检查实体完整性(唯一和非空),参照完整性约束和check约束,约束缺失扣除0.2分。 delete和update要支持where子句(and、or、between and、in、like),条件缺失和约束检查缺失扣除0.2分} [x] 当数据表的内容更新后,根据索引的定义,自动更新索引表的内容; {有存储索引节点的数据结构,有构造B+树的函数} [x] 在有索引的数据表上执行查询语句时,首先利用索引找到满足条件的元组指针,然后通过指针到数据表中取出相应的元组; [x] 执行GRANT语句,为用户授予对某数据库对象的SELECT、INSERT、DELETE、UPDATE等权限;执行REVOKE语句,收回上述权限;{grant和revoke各占0.5分} [x] 用户登录时,需要输入用户名;如果用户没有被授权,则拒绝执行用户查询或更新等操作,并给出提示信息;{有用户名和密码管理得0.5分;有权限管理得0.5分} [ ] 将SELECT语句转化为关系代数表达式,再利用查询优化算法对关系代数表达式进行优化,输出优化后的关系代数表达式或SELECT语句。
数据库原理 第三章:关系数据库标准语言SQL 授课教师:姜姗 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第1页。 3.5 数据更新 数据更新操作有3种: 插入数据 INSERT 修改数据 UPDATE 删除数据 DELETE 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第2页。 1、插入数据 两种插入数据的方式: 插入元组 插入子查询结果 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第3页。 插入元组 语句格式: INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)] VALUES (<常量1> [,<常量2>] … ); 功能: 将新元组插入指定表中。 新元组的属性列1的值为常量1,属性列2的值为常量2……。 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第4页。 例1:将一个新学生元组(学号:200215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。 INSERT INTO Student ( Sno, Sname, Ssex, Sdept, Sage ) VALUES ( '200215128', '陈冬', '男', ' IS', 18 ); 例2:将学生张成民( '200215126', '张成民', '男', 18, 'CS' );的信息插入到Student表中。 INSERT INTO Student VALUES ( '200215126', '张成民', '男', 18, 'CS' ); 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第5页。 插入子查询结果 语句格式: INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)] 子查询; 功能: 将子查询的结果插入指定表中。 说明: 子查询中,SELECT子句目标列必须与INTO子句匹配,包括:值的个数和值的类型。 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第6页。 插入子查询结果 例3:对每一个系,求学生的平均年龄,并把结果存入数据库。 第一步:建表 CREATE TABLE Dept_age (Sdept CHAR(15) , /* 系名*/ Avg_age SMALLINT ); /*学生平均年龄*/ 第二步:插入数据 INSERT INTO Dept_age ( Sdept, Avg_age ) SELECT Sdept, AVG(Sage) FROM Student GROUP BY Sdept; 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第7页。 2、修改数据 语句格式 UPDATE <表名> SET <列名> = <表达式>[,<列名>=<表达式>]… [ WHERE <条件> ]; 功能:修改指定表中满足WHERE子句条件的元组。 说明: SET子句指定修改的方式、要修改的列,以及修改后取值。 WHERE子句指定要修改的元组,缺省时表示要修改表中的所有元组。 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第8页。 三种修改方式: 修改某一个元组的值。 修改多个元组的值。 子查询的修改语句。 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第9页。 修改某一个元组的值 例1:将学生200215121的年龄改为22岁。 UPDATE Student SET Sage = 22 WHERE Sno = ' 200215121 '; 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第10页。 修改某一个元组的值 例2:将学生200215121的年龄增加1岁。 UPDATE Student SET Sage = Sage+1 WHERE Sno = ' 200215121 '; 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第11页。 修改多个元组的值 例3:将所有学生的年龄增加1岁。 UPDATE Student SET Sage= Sage+1; 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第12页。 子查询的修改语句 例4:将计算机科学系全体学生的成绩置零。 UPDATE SC SET Grade=0 WHERE Sno in ( SELECT Sno FROM Student WHERE Sdept='CS'); 数据库系统概论(王珊第五版)第十一讲全文共48页,当前为第13页。 3、删除数据 语句格式 DELETE FROM <表名> [ WHERE <条件> ]; 功能: 删除指定表中满足WHERE子句条件的元组。 说明: WHERE子句指定要删除的元组,缺省时表示要删除表中的全部元组,但是表的定义仍在数据字典中。 数据库系统概论(

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧