我有两张桌子。一个是预测列表(又名 PREDS)。另一个是关于预测的汇总统计数据的集合,也称为 STATS。到目前为止,PREDS 有大约 1 毫米的线,但它实际上仅由 30 个不同的模型生成,因此每个模型生成约 3 万个预测。
在 STATS 表中,每一行都是一个模型的汇总统计信息。由于旧模型不再存在,STATS 表中大约有 100 行。我试图找出 PREDS 表中的哪些模型不在 STATS 表中,以便我可以更新它们的汇总统计数据。
我正在尝试这样的东西:
SELECT distinct(t1.modelnum) FROM `PREDS` t1
where t1.modelnum not in (select distinct(modelnum) from `STATS` t2);
Run Code Online (Sandbox Code Playgroud)
但它需要永远运行。我可以快速运行不同的边 ( select distinct(modelnum) from...) 但是当组合在一起时,我似乎做错了什么。
有什么建议?
如果modelnum列 [in both tables] 不能为 NULL,LEFT JOIN/IS NULL 是最有效的方法:
SELECT DISTINCT p.modelnum
FROM PREDS p
LEFT JOIN STATS s ON s.modelnum = p.modelnum
WHERE s.modelnum IS NULL
Run Code Online (Sandbox Code Playgroud)
否则,由于重复 - [NOT] EXISTS 子句可能是更好的选择:
SELECT DISTINCT p.modelnum
FROM PREDS p
WHERE NOT EXISTS (SELECT NULL
FROM STATS s
WHERE s.modelnum = p.modelnum)
Run Code Online (Sandbox Code Playgroud)
下面看一下当列可以为 null时 NOT IN/NOT EXISTS 和 LEFT JOIN/IS NULL 是如何叠加的。