如何在SQLite中筛选检测数据不一致的异常记录
检测SQLite同产品ID对应不同名称的不一致数据
实现思路
核心分两步完成筛选:
- 先按
productID分组,过滤出关联了2个及以上不同productName的异常产品ID - 关联原表取出这些异常ID对应的所有不重复ID、名称组合,即为目标结果
可用SQL语句
通用CTE写法(适配SQLite 3.8.3及以上版本,覆盖绝大多数使用场景)
WITH abnormal_pids AS ( SELECT productID FROM 替换为你的实际表名 -- 注意不要使用table作为表名,table是SQL保留关键字 GROUP BY productID HAVING COUNT(DISTINCT productName) > 1 ) SELECT DISTINCT t.productID, t.productName FROM 替换为你的实际表名 t INNER JOIN abnormal_pids a ON t.productID = a.productID ORDER BY t.productID, t.productName;
老版本兼容写法(子查询实现)
如果你的SQLite版本过低不支持CTE语法,可以改用IN子查询实现完全一致的效果:
SELECT DISTINCT productID, productName FROM 替换为你的实际表名 WHERE productID IN ( SELECT productID FROM 替换为你的实际表名 GROUP BY productID HAVING COUNT(DISTINCT productName) > 1 ) ORDER BY productID, productName;
逻辑说明
- 核心判断条件
COUNT(DISTINCT productName) > 1会统计每个产品ID下不重复的名称数量,只有数量大于1时才判定为数据不一致。比如示例中productID=3虽然有2条记录,但名称均为Product D,计数为1,不会被判定为异常。 - 外层查询加
DISTINCT是为了去掉重复的ID+名称组合,避免同一个产品下多条名称完全一致的重复记录出现在结果中。
针对提供的测试数据运行上述语句,返回结果完全匹配预期:
productID productName 2 Product B 2 Product C
内容的提问来源于stack exchange,提问作者Albert Tobing
相关产品推荐
相关产品推荐

