2012-03-17 90 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。