我有两张桌子。一个是预测列表(又名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...
)但是当它合并时,我似乎做错了。
有什么建议吗?
答案 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
);
然后你只需要做一次干扰。