使用 DISTINCT() 的 MYSQL NOT IN 查询

scr*_*Owl 2 mysql sql join

我有两张桌子。一个是预测列表(又名 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...) 但是当组合在一起时,我似乎做错了什么。

有什么建议?

OMG*_*ies 5

如果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 是如何叠加的