一个困扰我很久的SQL问题,望大家帮忙解答

jiezi316 2008-10-31 02:46:51
1,从某表中选择出flag为0的记录
2,并将所选数据中的FLAG字段变为1

平时我的语句如下

Declare @tb table([id] int);
insert into @tb([id])
select [id] from [table] where [flag]=0;
update a set [flag]=1 From [table] as a join @tb as b on a.[id]=b.[id];
select a.* from [table] as a join @tb as b on a.[id]=b.[id];

之所以会用到@tb变量,我是担心我update的时候有可能记录只有n条,而最后select的时候可能由于数据增加了而选择了
n+1条记录出来

请问这样做是不是没有必要?请大家详细点解释好吗?
...全文
105 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiezi316 2008-10-31
  • 打赏
  • 举报
回复
OK,明白了
那就是我一直都是正确的,哈哈。
谢谢大家了
结贴!
-狙击手- 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jiezi316 的回复:]
我说具体点吧
1.我要更新数据库中FLAG=0的所有记录
2.我要将这些FLAG=0的记录都选择出来进行一些其他操作。

此表的数据插入很频繁


如果我这样写
select * from table flag=0
update table set flag=1 where flag=0;

我担心的是在select之后,由于新数据的插入而导致update更新了更多的记录,这样数据就不统一了。

所以我在用了的中间的@TB来存储该次要更新和选择出来的记录
[/Quote]


是的,你的担心是存在的(当然你用锁来操作时那不在讨论的范围)
同时你一楼的操作方法必须保证ID是唯一的,否则,你的select a.* from [table] as a join @tb as b on a.[id]=b.[id];这一句仍然会有N+M的情况出现
等不到来世 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jiezi316 的回复:]
引用 3 楼 happyflystone 的回复:
如果ID是主键,担心是多余的

Declare @tb table([id] int);
insert into @tb([id]) select [id] from [table] where [flag]=0;
update a set [flag]=1 From [table] where flag = 0;
select a.* from [table] as a join @tb as b on a.[id]=b.[id];

能具体点吗?
你这样写会不会出现。你插入@tb的时候有n条记录,而更新的时候却更新了n+1条记录,而最后你又只选择了n条记录的…
[/Quote]
完全有这个可能
jiezi316 2008-10-31
  • 打赏
  • 举报
回复
我说具体点吧
1.我要更新数据库中FLAG=0的所有记录
2.我要将这些FLAG=0的记录都选择出来进行一些其他操作。

此表的数据插入很频繁


如果我这样写
select * from table flag=0
update table set flag=1 where flag=0;

我担心的是在select之后,由于新数据的插入而导致update更新了更多的记录,这样数据就不统一了。

所以我在用了的中间的@TB来存储该次要更新和选择出来的记录
-狙击手- 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jiezi316 的回复:]
引用 3 楼 happyflystone 的回复:
如果ID是主键,担心是多余的

Declare @tb table([id] int);
insert into @tb([id]) select [id] from [table] where [flag]=0;
update a set [flag]=1 From [table] where flag = 0;
select a.* from [table] as a join @tb as b on a.[id]=b.[id];

能具体点吗?
你这样写会不会出现。你插入@tb的时候有n条记录,而更新的时候却更新了n+1条记录,而最后你又只选择了n条记录的…
[/Quote]

会的,如果你的ID是唯一标识行的列,那么你的操作是必须的,如果你使用2005的话,就可以用output .. into..方法
jiezi316 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happyflystone 的回复:]
如果ID是主键,担心是多余的

Declare @tb table([id] int);
insert into @tb([id]) select [id] from [table] where [flag]=0;
update a set [flag]=1 From [table] where flag = 0;
select a.* from [table] as a join @tb as b on a.[id]=b.[id];
[/Quote]
能具体点吗?
你这样写会不会出现。你插入@tb的时候有n条记录,而更新的时候却更新了n+1条记录,而最后你又只选择了n条记录的情况发生呢?
-狙击手- 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jiezi316 的回复:]
to happyflystone:
也就是说在2000下我这样做是有必要的么?
[/Quote]

1,从某表中选择出flag为0的记录
2,并将所选数据中的FLAG字段变为1
---

 如果仅是完成以上的工作,那么update a set [flag]=1 From [table] where flag = 0;一句就够了

如果你想知道这次更新了哪些ID的flag
1、如果更新时表有什么字段表明此次的更新,比如时间、更新人能唯一标识此次更新的,那也是只要上面一句话,你的操作是多余的
2、如果你仅是更新一个flag,然后更新完了要列出此次的更新记录并ID是唯一标识行时,你的操作是可行的,
3、如果你的ID不唯一,那么你以上的工作肯定是可能出现N+1的情况的
水族杰纶 2008-10-31
  • 打赏
  • 举报
回复
應該不會~~
等不到来世 2008-10-31
  • 打赏
  • 举报
回复
有必要。如果你真的有这样的需求:
1.更新flag
2.将更新的记录返回
-狙击手- 2008-10-31
  • 打赏
  • 举报
回复
如果ID是主键,担心是多余的

Declare @tb table([id] int);
insert into @tb([id]) select [id] from [table] where [flag]=0;
update a set [flag]=1 From [table] where flag = 0;
select a.* from [table] as a join @tb as b on a.[id]=b.[id];
jiezi316 2008-10-31
  • 打赏
  • 举报
回复
to happyflystone:
也就是说在2000下我这样做是有必要的么?
-狙击手- 2008-10-31
  • 打赏
  • 举报
回复
如果 是2005 ,看看这个http://blog.csdn.net/happyflystone/archive/2008/10/05/3017655.aspx

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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