带子查询的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循环再来查子表,这个耗费太大,实在没有办法时才考虑,暂时不采用。
...全文
504 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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元。(使用子查询的更新语句)

17,382

社区成员

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

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