能否编写SQL查询返回指定结果集?附测试样例数据
SQL查询方案:对比三个时期的产品信息
没问题,我来帮你编写这条SQL查询语句。根据你提供的三个表(当前、往期、未来产品),我们需要先收集所有出现过的产品名称,然后分别关联三个表获取对应的类别信息,不存在的就标记为'NA'。
最终SQL查询语句
WITH AllProductNames AS ( -- 获取所有唯一的产品名称(自动去重) SELECT Productname FROM CurrentProduct UNION SELECT Productname FROM PreviousProduct UNION SELECT Productname FROM FutureProduct ) SELECT apn.Productname, -- 若当前表存在该产品,拼接对应类别;无匹配则显示'NA' ISNULL((SELECT STRING_AGG(CategoryName, ', ') FROM CurrentProduct cp WHERE cp.Productname = apn.Productname), 'NA') AS Current_Category, -- 处理往期产品表的类别信息 ISNULL((SELECT STRING_AGG(CategoryName, ', ') FROM PreviousProduct pp WHERE pp.Productname = apn.Productname), 'NA') AS Previous_Category, -- 处理未来产品表的类别信息 ISNULL((SELECT STRING_AGG(CategoryName, ', ') FROM FutureProduct fp WHERE fp.Productname = apn.Productname), 'NA') AS Future_Category FROM AllProductNames apn ORDER BY apn.Productname;
语句说明
- CTE
AllProductNames:通过UNION合并三个表的产品名称并自动去重,确保我们能覆盖所有出现过的产品,不会遗漏任何条目。 - 子查询+
STRING_AGG:如果一个产品属于多个类别(你的样例里没有这种情况,但语句兼容该场景),会用逗号拼接所有关联类别;如果该产品在对应表中完全不存在,ISNULL会把返回的NULL替换成要求的'NA'。 - 排序:最后按产品名称排序,让结果更整洁易读。
执行结果(基于你的样例数据)
| Productname | Current_Category | Previous_Category | Future_Category |
|---|---|---|---|
| Prod1 | Cat1 | Cat1 | Cat1 |
| Prod2 | Cat1 | Cat1 | Cat1 |
| Prod3 | Cat2 | Cat4 | Cat4 |
| Prod4 | Cat5 | Cat5 | Cat5 |
| Prod5 | Cat5 | NA | NA |
内容的提问来源于stack exchange,提问作者Humayoun_Kabir
相关产品推荐
相关产品推荐

