這樣的sql語句怎麼寫?

hm8030 2007-04-04 10:24:52
有兩個表a,b,根據a表中的groupid state=1 任意選n條記錄插入倒b表中,然後更新table a 這n條記錄的狀態為0。
table a
id name groupid state
1 model1 1 1
2 model2 1 1
3 model3 1 1
4 model4 1 0
5 model5 2 1
6 model6 2 0
7 model7 2 0
8 model8 2 1
9 model9 2 1

table b
bid id

bid 為自增列

...全文
227 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
rookie_one 2007-04-04
  • 打赏
  • 举报
回复
别忘了,你先把之前在a上的触发器drop掉哦
paoluo 2007-04-04
  • 打赏
  • 举报
回复
hm8030(昨天的梦未醒,今天梦已开始) ( ) 信誉:100 Blog 2007-04-04 10:58:05 得分: 0


謝謝,理論上是可以的。但是這樣是不對了,因為會將以前的記錄也會一起更新,如果記錄多的話,速度也會慢起來。應該有一個更科學的辦法.


-------
像上面那樣,寫一個插入的觸發器就可以。

其余的時候更新這個狀態又不會觸發到這個觸發器。
rookie_one 2007-04-04
  • 打赏
  • 举报
回复
那就在b上创建insert触发器,当b被插入的时候,更新a中相应id的state
1 创建触发器
create trigger insert_b on b
for insert
as
update a set state=0
from a,inserted b
where a.id=b.id
go
2 往b插入数据

insert b(id)
select top 3 id from #temp where state=1 order by newid()
onlyonereason 2007-04-04
  • 打赏
  • 举报
回复
觸發器也不對,因為在其它的時候也會去更新這個狀態,
没明白你的意思
onlyonereason 2007-04-04
  • 打赏
  • 举报
回复
跟上面的差不多
create trigger tr_b on a
for update
as
if update(state)
begin

insert into b select id from inserted
update a set state=0 where id in (select id from inserted)
end


go
hm8030 2007-04-04
  • 打赏
  • 举报
回复
觸發器也不對,因為在其它的時候也會去更新這個狀態,
onlyonereason 2007-04-04
  • 打赏
  • 举报
回复
rookie_one(流氓会武术,谁都挡不住
你好象没重新更新a state=0
我学的不好 写的比较冗杂
create trigger tr_1 on a
for update
as
if (select state from inserted) =1
insert into b select id from inserted
update a set state=0 where id=(select id from inserted)
go
hm8030 2007-04-04
  • 打赏
  • 举报
回复
謝謝,理論上是可以的。但是這樣是不對了,因為會將以前的記錄也會一起更新,如果記錄多的話,速度也會慢起來。應該有一個更科學的辦法.
onlyonereason 2007-04-04
  • 打赏
  • 举报
回复
我昏 比我快
onlyonereason 2007-04-04
  • 打赏
  • 举报
回复
create table a(id int,name varchar(20) ,groupid int ,state int )
create table b(bid int identity(1,1),id int )

drop table a

可以用个触发器
create trigger tr_1 on a
for update
as
if (select groupid from inserted) =1 and (select state from inserted) =1
insert into b select id from inserted
update a set state=0 where id=(select id from inserted)


go

insert into a
select 1,'model1',1,0

select * from a
select * from b

update a set state=1 where id=1


不知道理解有没有错误
paoluo 2007-04-04
  • 打赏
  • 举报
回复
Insert b Select Top 3 id From A Where groupid = 1 And state = 1 Order By NewID()

Update A Set state = 1
From A
Inner Join B
On A.id = B.id

Or

Insert b Select Top 3 id From A Where state = 1 Order By NewID()

Update A Set state = 1
From A
Inner Join B
On A.id = B.id
rookie_one 2007-04-04
  • 打赏
  • 举报
回复
这样就可做到,在表a随机更新n条记录的同时,触发器也会同时把涉及到的记录插入到b中
rookie_one 2007-04-04
  • 打赏
  • 举报
回复
可以先更新,后插入

先在a上创建update触发器
create trigger up_a
for update
as
if update(state)
begin
insert b(id)
select id from deleted
end
go



随机更新3条记录:
update #temp
set state=0
where id in(select top 3 id from #temp where state=1 order by newid())
hm8030 2007-04-04
  • 打赏
  • 举报
回复
我沒寫好,應該groupid不一定等於1,中間應該加,才對.
sorry
onlyonereason 2007-04-04
  • 打赏
  • 举报
回复
"groupid state=1 " groupid state=1都要为1么 ?
hm8030 2007-04-04
  • 打赏
  • 举报
回复
呵呵,我沒做過觸發器,所以不知道其原理,謝謝各位,結貼!!

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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