如何在MS SQL中结合Split函数按指定条件删除重复记录?
解决指定邮箱+PMID列表的重复记录删除问题
我完全get你的需求——你想在插入新的邮箱-PMID关联记录前,先清理掉[dbo].[ADMIN_Publications_email]中该邮箱对应指定PMID列表里的那些重复记录,同时保留这个邮箱下其他PMID的记录,对吧?
你之前写的DELETE语句语法有问题,IN关键字后面不能直接跟函数调用,得把Split函数的结果包装成一个子查询(或者用JOIN的方式)。下面给你两种可行的实现方式:
方式一:子查询写法(直观易懂)
这种写法逻辑清晰,适合数据量不大的场景:
DELETE FROM [dbo].[ADMIN_Publications_email] WHERE email = @Email AND pmid IN (SELECT CAST(Item AS NVARCHAR(10)) FROM dbo.Split(@PMID_LIST, ','))
方式二:JOIN写法(性能更优)
如果你的表数据量比较大,用JOIN的方式通常会有更好的查询性能,SQL Server的查询优化器对JOIN的处理更高效:
DELETE ape FROM [dbo].[ADMIN_Publications_email] ape INNER JOIN dbo.Split(@PMID_LIST, ',') s ON ape.pmid = CAST(s.Item AS NVARCHAR(10)) WHERE ape.email = @Email
完整的插入前清理流程
为了避免删除和插入操作之间出现异常导致数据不一致,建议把这两个操作放在一个事务里:
BEGIN TRANSACTION; -- 第一步:删除已存在的匹配记录 DELETE ape FROM [dbo].[ADMIN_Publications_email] ape INNER JOIN dbo.Split(@PMID_LIST, ',') s ON ape.pmid = CAST(s.Item AS NVARCHAR(10)) WHERE ape.email = @Email; -- 第二步:插入新记录(沿用你原来的插入逻辑) INSERT INTO [dbo].[ADMIN_Publications_email] ([email], [pmid]) SELECT @email, CAST(Item AS NVARCHAR(10)) FROM dbo.Split(@PMID_List, ','); COMMIT TRANSACTION;
小提醒
一定要确保CAST(Item AS NVARCHAR(10))的类型和你的pmid字段类型完全匹配,如果pmid是整数类型,就改成CAST(Item AS INT),避免隐式转换带来的性能问题或者匹配错误。
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

