在insert的同时,选择性更新其他3张表,有没有可能一条语句完成

中文命名法 2021-02-22 10:47:34
A表字段:地址(文本,不重复),识别(逻辑)
B表字段:地址(文本,不重复),识别(逻辑)
C表字段:地址(文本,不重复),识别(逻辑)
T表字段:matchA(文本),matchB(文本),matchC(文本)

假设这是客户端提交过来的批量新增数据:
(select matchA='1NHXjRVE9L41',matchB='3NHXjRVE9L41',matchC='bc1NHXjRVE9L41' union all
select matchA='1JB4SXThJJFg',matchB='3JB4SXThJJFg',matchC='bc1JB4SXThJJFg' union all
select matchA='1KveoNMcyvJc',matchB='3KveoNMcyvJc',matchC='bc1KveoNMcyvJc' union all
select matchA='19B1tyo6372X',matchB='39B1tyo6372X',matchC='bc19B1tyo6372X')
数据插入到T表的同时能否同时按以下条件更新ABC这3张表:
假如表A中存在地址字段=matchA的纪录,将其的识别字段改为true;
假如表B中存在地址字段=matchB的纪录,将其的识别字段改为true;
假如表C中存在地址字段=matchC的纪录,将其的识别字段改为true;

在一次查询中能实现吗?因为数据很多,这样能快些。
...全文
146 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2021-02-23
  • 打赏
  • 举报
回复
建议用存储过程实现, 传入3个参数, 然后分别处理,

create proc [存储过程名]
(@matchA varchar(1000),
 @matchB varchar(1000),
 @matchC varchar(1000))
as
begin

begin try
 begin tran
  insert into T表(matchA,matchB,matchC) select @matchA,@matchB,@matchC

  update A表 set 识别=1 where 地址=@matchA and 识别=0

  update B表 set 识别=1 where 地址=@matchB and 识别=0
  
  update C表 set 识别=1 where 地址=@matchC and 识别=0
 commit tran
end try
begin catch
 rollback tran
end catch

end
中文命名法 2021-02-23
  • 打赏
  • 举报
回复
引用 1 楼 吉普赛的歌 的回复:
3个表只写一个语句完成不了。就算真实现了(类似触发器、存储过程之类),速度也不会更快。
业务是这样的,有4个数据生产者,不停地没有先后地提交数据。可以分成以下两类: 第一类中有3个数据生产者。数据只包含一个文本字段。例如:    生产者A提交(char)(不重复),    生产者B提交(char)(不重复),    生产者C提交(varchar)(不重复)。 第二类中只有1个生产者,提交的每一条都数据包含3个不重复属性:文本A(char),文本B(char),文本C(varchar),分别对应第一类生产者中的每一个。 要处理的是去比对第一类和第二类数据是否有相同的,然后做个bit标记。 譬如:第二类中的文本A等于第一类中的生产者A,   :第二类中的文本B等于第一类中的生产者B,   :第二类中的文本C等于第一类中的生产者C。 但不可能A和B,B和C去对比。 这个标记写在第一类上还是第二类上无所谓。数据很多,希望在新增的时候做比对和标记。我也可以改表的结构,请给一些建议。
吉普赛的歌 2021-02-23
  • 打赏
  • 举报
回复
3个表只写一个语句完成不了。就算真实现了(类似触发器、存储过程之类),速度也不会更快。 建议: 1. 关联字段加上索引, 比如:

create index ix_A_matchA on A(matchA);
create index ix_B_matchB on A(matchB);
create index ix_C_matchC on C(matchC);

create index ix_T_matchA on T(matchA);
create index ix_T_matchB on T(matchB);
create index ix_T_matchC on T(matchC);
2. 已更新过的数据是否下次还要更新?如果不用,那可以只取需要更新的。 类似:

update AA
SET AA.flag=1, needUpdate=0
from A as AA inner join T on AA.matchA=T.matchA
where AA.needUpdate=1

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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