2012-03-17 61 views
0

我有两个表。一个是预测列表(又名PREDS)。另一个是关于预测(即STATS)的汇总统计。到目前为止,PREDS具有大约1毫米的线条,但实际上它仅由30个不同的模型生成,因此每个模型都会生成约30,000个预测。MYSQL NOT IN查询使用DISTINCT()

在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...),但是当它们结合时,好像我做错了什么。

有什么建议吗?

+1

你对PREDS.modelnum有索引吗? – 2012-03-17 21:14:50

+0

不,没有索引。 – screechOwl 2012-03-17 21:16:27

+1

顺便说一下,'DISTINCT'不是一个函数,你知道(不在MySQL中)。这是一个使语句返回不同*行*的子句。是的,它适用于行,而不适用于列。 (括号中的列仅仅是括号中的一列。) – 2012-03-17 21:51:39

回答

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

取决于你有什么索引。 A not exits可能会帮助你

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

然后你只需要做一次distict。