SQL Server:如何用表1的ID匹配表2语句并新增统计列?
在SQL Server中实现批量统计与姓名汇总
针对你的需求,完全可以在SQL Server中实现,以下是具体步骤和代码:
一、批量统计表2中提及表1每行ID的行数
你可以通过子查询或关联查询的方式,将统计逻辑批量应用到表1的所有行:
方式1:查询结果直接展示
如果只是需要查询结果,不需要修改原表结构,可以用LEFT JOIN分组统计:
SELECT t1.ID, COUNT(t2.Sentence) AS 提及次数 FROM [Table 1] t1 LEFT JOIN [Table 2] t2 ON t2.Sentence LIKE '%' + t1.ID + '%' GROUP BY t1.ID
方式2:给表1新增列并更新数据
如果要将统计结果永久保存到表1中:
- 先添加“提及次数”列:
ALTER TABLE [Table 1] ADD 提及次数 INT DEFAULT 0;
- 用子查询批量更新每行的统计值:
UPDATE t1 SET 提及次数 = ( SELECT COUNT(Sentence) FROM [Table 2] t2 WHERE t2.Sentence LIKE '%' + t1.ID + '%' ) FROM [Table 1] t1;
二、汇总提及该行ID的人员姓名
假设表2中存储人员姓名的列为PersonName(请根据实际列名替换),SQL Server 2017及以上版本支持STRING_AGG函数来拼接多个姓名,步骤如下:
- 先添加“提及人员”列:
ALTER TABLE [Table 1] ADD 提及人员 VARCHAR(MAX);
- 批量更新汇总的人员姓名(如果需要去重,加上
DISTINCT):
UPDATE t1 SET 提及人员 = ( SELECT STRING_AGG(DISTINCT t2.PersonName, '、') FROM [Table 2] t2 WHERE t2.Sentence LIKE '%' + t1.ID + '%' ) FROM [Table 1] t1;
注意事项
- 用
LIKE '%' + t1.ID + '%'可能会匹配到包含该ID子串的内容(比如ID是"123",语句里的"1234"也会被匹配),如果ID有固定格式(比如前后有空格或特殊符号),可以调整匹配条件减少误判,例如:LIKE '% ' + t1.ID + ' %' - 如果你的SQL Server版本低于2017,无法使用
STRING_AGG,可以用FOR XML PATH的方式拼接字符串,示例:
UPDATE t1 SET 提及人员 = STUFF( (SELECT DISTINCT '、' + t2.PersonName FROM [Table 2] t2 WHERE t2.Sentence LIKE '%' + t1.ID + '%' FOR XML PATH('')), 1, 1, '' ) FROM [Table 1] t1;
内容的提问来源于stack exchange,提问作者petchde
相关产品推荐
相关产品推荐

