SQL实现:保留同一number下存在不同spec的所有数据行
实现逻辑
核心是两步筛选:
- 第一步:按需求里的
number对应分组字段(即你查询里的partno)做分组,统计每组下spec对应比对字段的去重值数量,仅保留去重数>1的分组ID,这类分组下比对字段取值不完全一致,符合全量保留的要求。 - 第二步:原基础关联查询仅返回属于上述有效分组的所有行即可。
适配现有SQL的代码实现
字段映射说明:默认
partno对应需求的number分组列,你可根据实际业务替换HAVING子句里的比对字段(对应需求的spec列),比如当前示例以g08huqty为比对字段,若实际比对的是partdsc1直接替换即可。
写法1(CTE 可读性更高,适合大表查询):
WITH valid_groups AS ( SELECT L62T1.partno FROM L62T1 JOIN G08T1 ON G08T1.shortl62 = L62T1.shortl62 GROUP BY L62T1.partno -- 比对字段去重数大于1,说明同分组下取值不完全一致 HAVING COUNT(DISTINCT G08T1.g08huqty) > 1 ) SELECT L62T1.partno, L62T1.partdsc1, G08T1.g08huqty FROM L62T1 JOIN G08T1 ON G08T1.shortl62 = L62T1.shortl62 -- 仅保留有效分组的行 JOIN valid_groups ON valid_groups.partno = L62T1.partno
写法2(IN 子查询 写法更简洁):
SELECT L62T1.partno, L62T1.partdsc1, G08T1.g08huqty FROM L62T1 JOIN G08T1 ON G08T1.shortl62 = L62T1.shortl62 WHERE L62T1.partno IN ( SELECT L62T1.partno FROM L62T1 JOIN G08T1 ON G08T1.shortl62 = L62T1.shortl62 GROUP BY L62T1.partno HAVING COUNT(DISTINCT G08T1.g08huqty) > 1 )
注意事项
- 若你实际的分组字段不是
partno,可全局替换成对应字段名即可。 - 若比对字段需要忽略大小写、空值等特殊规则,可在
COUNT(DISTINCT 比对字段)前增加对应的处理函数,比如COUNT(DISTINCT UPPER(G08T1.g08huqty))。
内容的提问来源于stack exchange,提问作者Fredrik Rothman
相关产品推荐
相关产品推荐

