SQLite检查表行数相等的查询未结束问题排查及正确方法
SQLite检查表行数相等的问题与解决方法
我使用SQLite 3.39.3版本,编写了如下查询语句以检查两张表的行数是否相等:
SELECT COUNT(a.auth_id)=COUNT(b.auth_scopus_id) FROM auth_subject_areas_mapping AS a, auth_subject_areas_mapping_old AS b;但该查询始终无法结束,想知道:
- 我的查询存在什么问题?
- 在SQLite中检查表行数相等的正确方法是什么?
1. 你的查询存在的问题
- 该查询会对两张表执行笛卡尔积连接(未指定任何连接条件的多表查询),生成的中间结果集行数是两张表行数的乘积。比如两张表各有1万行,中间结果就会有1亿行,数据量稍大就会导致查询无限运行。
- 你原本的需求是统计两张表各自的行数并比较,但当前写法是在笛卡尔积的结果里统计指定列的非空值数量,完全偏离了预期目标。
2. SQLite检查表行数相等的正确方法
方法一:直接比较两张表的总行数(最常用)
通过子查询分别获取每张表的总行数,再做相等判断:
SELECT (SELECT COUNT(*) FROM auth_subject_areas_mapping) = (SELECT COUNT(*) FROM auth_subject_areas_mapping_old) AS rows_are_equal;
COUNT(*)会统计表中所有行(包括含NULL值的行),效率极高,SQLite会优先调用表的统计信息快速返回结果,无需全表扫描(若统计信息为最新状态)。
方法二:比较指定列的非空行数
如果你需要验证某一列的非空行数量相等(比如原查询中的auth_id和auth_scopus_id),可以用COUNT(列名)分别统计:
SELECT (SELECT COUNT(auth_id) FROM auth_subject_areas_mapping) = (SELECT COUNT(auth_scopus_id) FROM auth_subject_areas_mapping_old) AS non_null_rows_equal;
COUNT(列名)仅统计该列不为NULL的行,适合需要排除空值的场景。
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

