查询关联表中Detailed Description列高频词及对应Simple Description
问题分析与修正方案
原场景说明
已关联两张表:
- 表1提供
SKU、Detailed Description列 - 表2提供
Simple Description列
数据示例:
| SKU | Detailed Description | Simple Description |
|---|---|---|
| 123456 | Salmon Trout | Fish |
| 654321 | Sea Bass | Tool |
需求:
- 提取
Detailed Description列中出现频率最高的词汇 - 同时获取这些词汇对应的
Simple Description值
原SQL的问题
- 缺失表关联条件:
INNER JOIN table2 b未指定关联逻辑(比如ON a.SKU = b.SKU,假设SKU为两表关联键) - 分组规则违规:SELECT子句中的
a.SKU、a.DESCRIPTION等列未在GROUP BY中,也未使用聚合函数,不符合SQL分组要求 - 列名混淆:原代码中
a.DESCRIPTION应为表1的Detailed Description列,存在列名写错的问题 - 逻辑偏离需求:未正确关联词汇与对应
Simple Description,也未实现按词汇频率排序的核心逻辑
修正后的SQL方案
假设两表通过SKU关联,以下代码先拆分Detailed Description中的词汇,统计频率后关联对应的Simple Description:
WITH E1(N) AS ( SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t(N) ), E2(N) AS (SELECT 1 FROM E1 a CROSS JOIN E1 b), E4(N) AS (SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 拆分Detailed Description为单个词汇 SplitWords AS ( SELECT b.[Simple Description], LTRIM(RTRIM(SUBSTRING(a.[Detailed Description], l.N1, l.L1))) AS Word FROM table1 a INNER JOIN table2 b ON a.SKU = b.SKU -- 替换为实际关联条件 CROSS APPLY ( SELECT s.N1, L1 = ISNULL(NULLIF(CHARINDEX(' ', a.[Detailed Description], s.N1), 0) - s.N1, 4000) FROM( SELECT 1 UNION ALL SELECT t.N + 1 FROM( SELECT TOP (ISNULL(DATALENGTH(a.[Detailed Description])/2, 0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 ) t(N) WHERE SUBSTRING(a.[Detailed Description], t.N, 1) = ' ' ) s(N1) ) l(N1, L1) WHERE LTRIM(RTRIM(SUBSTRING(a.[Detailed Description], l.N1, l.L1))) <> '' ) -- 统计词汇频率并关联对应Simple Description SELECT TOP 50 Word, COUNT(*) AS Frequency, -- 若一个词汇对应多个Simple Description,用逗号分隔;去重则保留DISTINCT STRING_AGG(DISTINCT [Simple Description], ', ') AS Related_Simple_Descriptions FROM SplitWords GROUP BY Word ORDER BY Frequency DESC;
关键说明
- 务必将
ON a.SKU = b.SKU替换为实际的两表关联条件 STRING_AGG适用于SQL Server 2017及以上版本,低版本可改用STUFF+FOR XML PATH拼接结果- 若需保留所有关联记录而非去重,删除
STRING_AGG中的DISTINCT即可
内容的提问来源于stack exchange,提问作者VINIJR
相关产品推荐
相关产品推荐

