2012-03-17 14 views
0

私は2つのテーブルがあります。 1つは予測のリスト(別名PREDS)です。もう一つはSTATSと呼ばれる予測に関する要約統計の集まりです。今のところ、PREDSは約1mmのラインを持っていますが、30個の異なるモデルによって実際に生成されるので、各モデルは約30k予測を生成します。MYSQL NOT DISTINCT()を使用してクエリ

STATSテーブルでは、各行は1つのモデルの要約統計量です。 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にインデックスがありますか? –

+0

いいえ、インデックスはまだありません。 – screechOwl

+1

ところで、 'DISTINCT'は関数ではありません(MySQLではなく)。これは、ステートメントをdistinct * rows *に戻す句です。はい、行に適用され、列には適用されません。 (そしてカッコ内の列はカッコ内の列にすぎません) –

答えて

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

あなたが持っているインデックスに応じて。 not exitsあなたが

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

次に、あなただけのdistictを一度行う必要が役立つかもしれません。

関連する問題