這樣的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 為自增列

...全文
277 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
  • 打赏
  • 举报
回复
呵呵,我沒做過觸發器,所以不知道其原理,謝謝各位,結貼!!
源码链接: https://pan.quark.cn/s/dbe32f6bace6 在本指南中,我们将详细解析如何在银河麒麟v10操作系统平台上完成MySQL 5.7的安装过程。银河麒麟v10作为一个基于Linux内核的国产操作系统,特别适用于arm架构的aarch64计算平台。鉴于我们讨论的是免编译的安装方法,这意味着我们将借助预先编译好的二进制软件包来简化操作步骤,而非采用从源代码开始的编译方式。 ### 一、前期准备 1. **系统更新**: 在部署任何新软件之前,务必确保操作系统处于最新状态,此举旨在规避潜在的兼容性挑战和已知的安全隐患。 ``` sudo apt-get update sudo apt-get upgrade ``` 2. **依赖安装**: MySQL 5.7版本在运行时可能需要特定的库文件支持,比如libaio和jemalloc。在银河麒麟v10环境中,可以通过以下指令来安装这些必需的依赖项: ``` sudo apt-get install libaio1 libaio-dev jemalloc-dev ``` ### 二、获取MySQL 5.7二进制文件 由于银河麒麟v10运行在arm架构之上,因此需要寻找适配aarch64架构的MySQL 5.7二进制文件。这些文件可从MySQL的官方发布渠道或授权的第三方镜像站点获取。务必确认下载的文件名与压缩包内的内容一致。例如,文件名应为`mysql-5.7.37-linux-glibc2.17-arm64.tar.gz`。 ### 三、部署MySQL 5.7 1. **文件解压缩**: 将下载的MySQL压缩文件解压至一个指定目录,例如 `/usr/local/`。 ``` tar...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 Node.js 是一种开放源代码且能够在多种操作系统上运行的 JavaScript 执行环境,它使得开发人员能够在服务器端执行 JavaScript 代码。Node.js 采用了 V8 引擎,该引擎是由 Google 为 Chrome 浏览器开发的一个高性能的 JavaScript 解释器。Node.js 的 16.x 版本在其发展历程中占据着重要位置,其中包含了众多新功能以及性能上的改进。标题 "Nodejs16-x64 windows安装包" 指向的是专为 Windows 操作系统设计的 64 位版本的 Node.js 16 安装程序。在 Windows 平台上安装 Node.js 的 64 位版本对于处理大量数据或运行需要高性能的应用程序来说尤为关键,因为 64 位系统能够更有效地利用硬件资源。描述 "Nodejs-16 x64位windows 安装包" 明确了该安装程序是为 Windows 用户准备的,特别是对于那些需要运行 64 位应用程序的用户。x64 表明该版本兼容 64 位架构,意味着它能够充分利用 64 位计算机的内存和处理能力。标签 "Node Nodejs nodejs16" 提供了关于此安装包的核心信息,表明它与 Node.js 相关,并且具体指的是 v16 版本。这些标签有助于进行搜索和分类,从而方便用户找到他们所需要的特定版本。压缩包文件 "node-v16.18.0-x64.msi" 代表实际的安装文件,其中 "v16.18.0" 指示了 Node.js 的具体版本号,"x64" 再次强调了其适用于 64 位系统,而 ".msi" 后缀表明这是一...

34,876

社区成员

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

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