SQL:查询数据不在其他表中

时间:2016-02-02 09:44:15

标签: sql database performance sql-server-2008 ssms

我希望标题有点清楚。

情况: 测量表,大约350.000.000条记录在这里。 带有传感器ID的表格,大约有300条记录在这里。

现在,当我需要传感器的特定测量时,我获取传感器ID并使用该传感器ID(以及特定数据或其他)查​​询测量表。这些查询运行得非常快(传感器id和其他一些列的索引)。

然而,这是一个长期运行的项目,我不知道有多少数据" old" (我无法访问的测量值,因为传感器ID不在我的传感器表中)。让我们说:

measurements table
sensor id
1
2
3
4
5

sensor table
1
4
5

我想从测量表中选择不在传感器表中的所有ID。我通常使用以下查询执行此操作:

SELECT sensor_id
FROM measurement_table
WHERE sensor_id NOT IN (
  SELECT sensor_id
  FROM sensor_table
  WHERE sensor_id IS NOT NULL)
)
GROUP BY sensor_id

在一张“小”的桌子上,比如几千甚至一百万条记录,这是可行的。但是,当我在我的测量表上运行此查询时,它需要太长时间(在将近一小时后取消它)。

有没有办法让我找出测量表中的传感器ID是什么,而不是传感器表?

编辑:

SELECT COUNT(*)
FROM measurements_table
WHERE sensor_id IN (
    SELECT sensor_id
    FROM sensor_table
)

工作(没有组,计数),给出:

334214244

表中的总数:

337225071

所以我想通过ID找到那些3010827记录......

2 个答案:

答案 0 :(得分:4)

SELECT m.sensor_id
FROM measurement_table m
LEFT JOIN sensor_table s ON m.sensor_id = s.sensor_id
WHERE s.sensor_id IS NULL

也许您需要SELECT DISTINCT

答案 1 :(得分:2)

通过左连接:

 SELECT t1.sensor_id
  FROM measurement_table t1
 LEFT JOIN sensor_table t2 
   ON t1.sensor_id = t2.sensor_id
 WHERE t2.sensor_id IS NULL

通过存在:

Select t1.sensor_id
 From measurement_table t1
where not exists(
select 1 from sensor_table t2 where t2.sensor_id=t1.sensor_id
)

绝不使用NOT IN

左连接和存在可以做这件事,但我们不能说哪个更快。它将取决于你的表中的索引和其他东西,你可以尝试这两个并选择一个更快的