使用DISTINCT()的MYSQL NOT IN查询

时间:2012-03-17 21:09:01

标签: mysql sql join

我有两张桌子。一个是预测列表(又名PREDS)。另一个是关于预测(即STATS)的汇总统计数据的集合。到目前为止,PREDS有大约1mm的线,但它实际上只由30个不同的模型生成,因此每个模型产生约30k的预测。

在STATS表中,每一行都是一个模型的摘要统计。由于旧模型不再存在,STATS表中大约有100行。我试图找到PREDS表中的哪些模型不在STATS表中,以便我可以更新它们的摘要统计数据。

我正在尝试这样的事情:

SELECT distinct(t1.modelnum) FROM `PREDS` t1
where t1.modelnum not in (select distinct(modelnum) from `STATS` t2);

但它需要永远运行。我可以快速运行各个方面(select distinct(modelnum) from...)但是当它合并时,我似乎做错了。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

如果modelnum column [in both tables] can not be NULL, the LEFT JOIN/IS NULL is the most efficient means

   SELECT DISTINCT p.modelnum
     FROM PREDS p
LEFT JOIN STATS s ON s.modelnum = p.modelnum
    WHERE s.modelnum IS NULL

否则,由于重复 - [NOT] EXISTS子句可能是更好的选择:

SELECT DISTINCT p.modelnum
  FROM PREDS p
 WHERE NOT EXISTS (SELECT NULL
                     FROM STATS s
                    WHERE s.modelnum = p.modelnum)

这是look at how the NOT IN/NOT EXISTS and LEFT JOIN/IS NULL stack up when columns are nullable

答案 1 :(得分:1)

取决于您拥有的索引。 not exits可能会帮助您

SELECT 
  distinct(t1.modelnum) 
FROM 
  `PREDS` t1
where NOT EXISTS
  (
      SELECT
        NULL
     FROM
        `STATS` t2
     WHERE
        t2.modelnum=t1.modelnum
  );

然后你只需要做一次干扰。