sqlite - 表 2 中不存在表 1 中的行的两个表中的 sql 行数
问题描述
我在 SQLite 数据库中有两个表,就像这样
| t1 |
|===============|
| t1_id | other |
|-------|-------|
| 1 | sdfds |
| 2 | asdaa |
| 3 | lkjeq |
| t2 |
|=======================|
| t2_id | t1_id | other |
|-------|-------|-------|
| 1 | 1 | dggeh |
| 2 | 1 | iohio |
| 3 | 3 | ytucc |
| 4 | 3 | .noih |
| 5 | 3 | /oioi |
大约有。两个表中都有 300K+ 行。我想要t1在t2中具有相关行的计数以及那些没有相关行的计数。那是,
"count of t1 with related t2" : 2
"count of t1 with no related t2": 1
当然,我可以从
SELECT Count(*) FROM t1 JOIN t2 ON t1.t1_id = t2.t1_id;
通过从t1的总计数中减去上述值,得到“与 t1 无关的 t2 计数” 。但是如何有效地从 SQL 查询中获取它呢?我尝试了以下
EXPLAIN QUERY PLAN SELECT t1_id FROM t1 AS t
WHERE NOT EXISTS (SELECT * FROM t2 WHERE t.t1_id = t2.t1_id);
我看到t1_id
表t2中的索引没有使用。当我尝试查询时,它需要很长时间,比如 100 秒。
解决方案
几种可能性:
SELECT count(*) FROM
(SELECT t1_id FROM t1
EXCEPT
SELECT t1_id FROM t2);
或者
SELECT count(*)
FROM t1
WHERE t1_id NOT IN (SELECT t1_id FROM t2);
或(与您的原件略有不同):
SELECT count(*)
FROM t1
WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE t1.t1_id = t2.t1_id);
所有这三个都应该在t2(t1_idx)
. 您必须对真实数据进行基准测试,看看哪个更快。
推荐阅读
- mongodb - 通过外键加入 2 个集合后的 MongoDB 全文搜索
- jquery - 错误消息中的“描述”HTML 元素(没有 ID)
- if-statement - 强制单元格输入所需的 VBA 代码(如果请)
- scala - 比较文件名以使用 ID 和 timetemp 信息获取最新文件,然后在 spark scala 中合并到一个文件中
- jmeter - JMeter ForEach 具有多次迭代的控制器事务名称
- typescript - 具有相同类型的所有成员的类类型
- video - FFMPEG:合并图像和音频以创建视频
- apache-kafka - 生产者的基准测试 - apache kafka
- powershell - 打开 CMD 时如何提示/隐藏密码?
- java - “字段需要一个无法找到的 bean。” Spring找不到我的存储库接口