MERGE能一次解决批量新增数据时与另2张表对比吗?

中文命名法 2021-02-20 04:58:01
目前是这样的,批量新增数据时,先与表A排重,不重复的插入到表A中。
MERGE INTO 表A 已有 USING
(SELECT '1NHXjRVkXVz2geAr12in8AAxK69caE9L41' d
UNION ALL SELECT '1JB4SXTfWPDyw4o1abudfurcPsQ4thJJFg' d
UNION ALL SELECT '1KveoNM2cVPkTpbMeYKGUheenwCcFcyvJc' d
UNION ALL SELECT '19B1tyo63GfVZEp85Kq18vgpYbzNKQE72X' d)
新增 ON(已有.地址=新增.d) WHEN NOT MATCHED THEN INSERT(地址) VALUES(新增.d);
需要再加入一个逻辑:假设收到客户端提交过来100条数据,完成排重后有20条数据准备要新增到表A中去。现在将这20条记录再与表B做一下对比,如果记录存在于B中,给它们标记个记号,日后使用。
...全文
119 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
中文命名法 2021-02-21
  • 打赏
  • 举报
回复
引用 5 楼 唐诗三百首 的回复:

insert into A表(地址,识别)
 select 地址=t.d,
        识别=case when exists(select 1 from B表 b where b.地址=t.d) then 1 
		         else 0 end
  from (select d='1NHXjRVkXVz2geAr12in8AAxK69caE9L41' union all
        select d='1JB4SXTfWPDyw4o1abudfurcPsQ4thJJFg' union all
	    select d='1KveoNM2cVPkTpbMeYKGUheenwCcFcyvJc' union all
	    select d='19B1tyo63GfVZEp85Kq18vgpYbzNKQE72X') t
  left join A表 a on t.d=a.地址
  where a.地址 is null
一字不差!!!
卖水果的net 2021-02-20
  • 打赏
  • 举报
回复
现在将这20条记录再与表B做一下对比,如果记录存在于B中,给它们标记个记号,日后使用。 可以在数据写过来的时候,就把记号写上。
唐诗三百首 2021-02-20
  • 打赏
  • 举报
回复

insert into A表(地址,识别)
 select 地址=t.d,
        识别=case when exists(select 1 from B表 b where b.地址=t.d) then 1 
		         else 0 end
  from (select d='1NHXjRVkXVz2geAr12in8AAxK69caE9L41' union all
        select d='1JB4SXTfWPDyw4o1abudfurcPsQ4thJJFg' union all
	    select d='1KveoNM2cVPkTpbMeYKGUheenwCcFcyvJc' union all
	    select d='19B1tyo63GfVZEp85Kq18vgpYbzNKQE72X') t
  left join A表 a on t.d=a.地址
  where a.地址 is null
中文命名法 2021-02-20
  • 打赏
  • 举报
回复
A表字段:地址(文本),识别(逻辑) B表字段:地址(文本) 客户端发来一堆记录,只包含地址(文本),想要实现: 第一步:先和A表做差集,去掉这堆记录中已经存在于A表的记录, 第二部,把第一步结果中的记录保存到A表中,但是分2种情况,第一种是不存在于B表中,第二种就是B表中也有该记录。保存时候区别就写在识别字段上。
中文命名法 2021-02-20
  • 打赏
  • 举报
回复
引用 2 楼 二月十六 的回复:
大概这个意思
MERGE INTO 表A 已有 USING
(SELECT temp1.d,b.记号* FROM (SELECT '1NHXjRVkXVz2geAr12in8AAxK69caE9L41' d
UNION ALL SELECT '1JB4SXTfWPDyw4o1abudfurcPsQ4thJJFg' d
UNION ALL SELECT '1KveoNM2cVPkTpbMeYKGUheenwCcFcyvJc' d
UNION ALL SELECT '19B1tyo63GfVZEp85Kq18vgpYbzNKQE72X' d) temp1 LEFT JOIN b ON temp1.col = b.col)
新增 ON(已有.地址=新增.d) WHEN NOT MATCHED THEN INSERT(地址,记号) VALUES(新增.d,新增.记号);
这个顺序看上去是先将要插入的数据与B表对比,然后再找A表去重。是吗?但是B这个表非常大,能否与A表先做去重,再去和B表对比。这样能快许多。
二月十六 2021-02-20
  • 打赏
  • 举报
回复
大概这个意思
MERGE INTO 表A 已有 USING
(SELECT temp1.d,b.记号* FROM (SELECT '1NHXjRVkXVz2geAr12in8AAxK69caE9L41' d
UNION ALL SELECT '1JB4SXTfWPDyw4o1abudfurcPsQ4thJJFg' d
UNION ALL SELECT '1KveoNM2cVPkTpbMeYKGUheenwCcFcyvJc' d
UNION ALL SELECT '19B1tyo63GfVZEp85Kq18vgpYbzNKQE72X' d) temp1 LEFT JOIN b ON temp1.col = b.col)
新增 ON(已有.地址=新增.d) WHEN NOT MATCHED THEN INSERT(地址,记号) VALUES(新增.d,新增.记号);
二月十六 2021-02-20
  • 打赏
  • 举报
回复
里边那个新增那里加一个left join b表 把记号一起放进去

27,579

社区成员

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

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