首页 > 解决方案 > 表 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_idt2中的索引没有使用。当我尝试查询时,它需要很长时间,比如 100 秒。

标签: sqlite

解决方案


几种可能性:

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). 您必须对真实数据进行基准测试,看看哪个更快。


推荐阅读