SQL表重复行排查:查询int_pn重复但ext_pn不一致的行
解决你的SQL查询需求
没问题,我来帮你搞定这个问题!你需要找出表中那些int_pn出现多次,但对应ext_pn不一致的行,对吧?下面给你两种可行的实现方法,逻辑清晰而且容易理解:
方法一:子查询筛选目标分组
这种方式用子查询先锁定有问题的int_pn,再提取对应行:
SELECT warehouse, int_pn, ext_pn FROM your_table_name -- 记得替换成你的实际表名 WHERE int_pn IN ( SELECT int_pn FROM your_table_name GROUP BY int_pn HAVING COUNT(DISTINCT ext_pn) > 1 );
方法二:CTE(公共表表达式)更直观
如果想要逻辑拆分得更清楚,用CTE会更易读:
WITH problematic_int_pns AS ( -- 先找出存在多个不同ext_pn的int_pn SELECT int_pn FROM your_table_name GROUP BY int_pn HAVING COUNT(DISTINCT ext_pn) > 1 ) -- 再从原表中取出这些int_pn对应的所有行 SELECT warehouse, int_pn, ext_pn FROM your_table_name JOIN problematic_int_pns ON your_table_name.int_pn = problematic_int_pns.int_pn;
逻辑说明
- 核心筛选逻辑:通过
GROUP BY int_pn把数据按int_pn分组,然后用COUNT(DISTINCT ext_pn) > 1判断这个分组里的ext_pn是不是有多个不同的值——这就是你要找的存在拼写错误的目标分组。 - 主查询部分:把原表和筛选出来的目标
int_pn关联,就能得到所有属于这些分组的行,正好是你期望的结果。
用你提供的示例数据测试的话,这两个查询都会返回:
warehouse | int_pn | ext_pn ----------|---------|-------- 1 | ABC200 | XYZ021 2 | ABC200 | XYY021
完全匹配你的需求哦!
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

