SQL多值字段拆分后去重与精准匹配技术问询
解决SQL拆分多值字段后重复行的问题
看起来你已经用DelimitedSplit8K函数完成了多值字段的拆分,但因为每个字段拆出了多个条目,导致每个ID生成了重复行。要实现每个ID/账号对应唯一Plan并正确匹配Tax字段,我们可以通过关联ID的序号和拆分项的位置来筛选出需要的行。
解决方案代码
WITH SplitData AS ( SELECT [ID], [account_number], [Plan], DepositList.Item AS Deposits, Tax1List.Item AS Tax1, Tax2List.Item AS Tax2, DepositList.ItemNumber, -- 给同一账号下的ID按顺序编号,用来匹配拆分项的位置 ROW_NUMBER() OVER(PARTITION BY account_number ORDER BY ID) AS IDSeq FROM MVTable CROSS APPLY dbo.DelimitedSplit8K(MVTable.Deposits, ';') AS Depositlist CROSS APPLY dbo.DelimitedSplit8K(MVTable.Tax1, ';') AS Tax1List CROSS APPLY dbo.DelimitedSplit8K(MVTable.Tax2, ';') AS Tax2List WHERE DepositList.Itemnumber = Tax1list.itemnumber AND Depositlist.itemnumber = Tax2list.itemnumber ) SELECT ID, account_number, Plan, Deposits, Tax1, Tax2 FROM SplitData WHERE ItemNumber = IDSeq;
代码说明
- CTE拆分数据:先用
CROSS APPLY拆分所有多值字段,同时保留拆分项的ItemNumber(即拆分后条目的位置,从1开始计数)。 - 生成ID序号:用
ROW_NUMBER()窗口函数给同一账号下的ID按顺序编号(IDSeq),这样第一个ID对应序号1,第二个对应序号2,以此类推。 - 筛选匹配行:通过
ItemNumber = IDSeq的条件,让每个ID对应到拆分后的对应位置条目,从而得到每个ID唯一的一行数据,正好匹配你想要的结果。
为什么原查询会生成重复行?
原查询中,每个多值字段拆出2个条目,CROSS APPLY会将这些条目按ItemNumber匹配,所以每个ID会生成2行数据(对应拆分后的2个条目)。我们通过添加序号关联的条件,精准筛选出每个ID需要的那一行,就解决了重复问题。
内容的提问来源于stack exchange,提问作者prathap kasthuri
相关产品推荐
相关产品推荐

