SQLite中如何查询包含全表唯一值的行?
解决SQLite中筛选包含全局唯一值的行问题
你的需求是找出原表中至少包含一个在col_A和col_B两列中总共仅出现一次的值的行,下面是兼容SQLite的解决方案:
正确SQL语句
SELECT t.* FROM my_table t WHERE EXISTS ( -- 统计所有值的全局出现次数,筛选仅出现一次的值 SELECT 1 FROM ( SELECT col_A AS val FROM my_table UNION ALL SELECT col_B AS val FROM my_table ) AS all_vals GROUP BY val HAVING COUNT(*) = 1 AND val IN (t.col_A, t.col_B) );
逻辑解释
- 合并两列数据:用
UNION ALL把col_A和col_B的所有值合并成一个完整列表(保留重复项,保证计数准确)。 - 筛选全局唯一值:对合并后的列表按值分组,通过
COUNT(*) = 1找出在两列中总共只出现一次的值。 - 匹配目标行:外层查询通过
EXISTS判断当前行的col_A或col_B是否属于这些全局唯一值,符合条件的行即为结果。
验证结果
用你提供的示例数据测试,该语句会返回预期结果:
| col_A | col_B |
|---|---|
| 444 | 333 |
| 222 | 555 |
| 333 | 666 |
原语句失效原因
UNION的误用:你用UNION合并单列唯一值,会丢失重复计数,无法统计值在两列中的总出现次数,导致错误包含全局重复的值。- 语法错误:
(子查询) IN (col_A, col_B)不符合SQLite语法,即使调整为col_A IN (子查询) OR col_B IN (子查询),也因为第一个问题无法得到正确结果。
内容的提问来源于stack exchange,提问作者AndroidTank
相关产品推荐
相关产品推荐

