You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

但该查询始终无法结束,想知道:

  1. 我的查询存在什么问题?
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:31:01