SQL Server 2014消除一对多连接重复数据的实现方法
实现一对多关系的多行字段合并(SQL Server 2014)
在SQL Server 2014里,你完全不需要用CTE就能搞定这个需求——用FOR XML PATH('')的拼接方法就可以轻松把同一个Job下的多条Route合并成一行,具体的SQL语句如下:
SELECT h.JobID, h.JobStart, h.Item, STUFF( ( SELECT ' ' + CAST(d.Route AS VARCHAR(10)) FROM tblJobDtl d WHERE d.JobID = h.JobID FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 1, '' ) AS Route FROM tblJobHead h GROUP BY h.JobID, h.JobStart, h.Item;
代码细节解释:
FOR XML PATH('')子查询:它会把当前JobID对应的所有Route值,前面加个空格后拼接成一个连续的字符串。比如JobID=1的子查询会生成10 20 30这样的结果。STUFF函数:用来移除字符串开头多余的空格——它从第1个字符位置开始,删除1个字符(也就是那个开头的空格),最终得到10 20 30这种干净的格式。GROUP BY子句:确保每个JobID只返回一行结果,对应tblJobHead里的唯一主记录,避免重复。
关于CTE的疑问:
CTE在这里并不是必需的,上面的查询已经足够简洁高效。只有当你需要先对数据做复杂的过滤、转换等预处理时,CTE才会派上用场。针对你当前的需求,直接用分组+XML拼接的方案就完全够用了。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

