【问题标题】:SQL: Query data NOT IN other tableSQL:查询不在其他表中的数据
【发布时间】:2016-05-11 01:01:45
【问题描述】:

我希望标题有点清楚。

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

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

但是,这是一个长期运行的项目,我不知道有多少数据是“旧的”(我无法访问的测量值,因为传感器 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 记录...

【问题讨论】:

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


    【解决方案1】:

    通过左连接:

     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

    left join 和 exists 可以做到这一点,但我们不能说哪个更快。这将取决于您表中的索引和其他内容,您可以尝试这两个并选择一个更快的

    【讨论】:

    • NOT IN 对于显式值集是首选,子查询会出现问题。对 NOT IN 风险的解释可能比硬禁令更好。
    • @reaanb 是的,你是对的。检查这个stackoverflow.com/questions/173041/not-in-vs-not-exists。在这个问题中,它很好地解释了not in。
    • 非常感谢! NOT EXISTS 版本花了 6:01 执行并给了我想要的结果:P
    • @Tjab,只是好奇,您是否也尝试过 LEFT JOIN 版本?什么时候?
    • @jarlh,不,我没有尝试那个。我现在也有点害怕使用它,因为繁重的查询(NOT IN)花了很长时间并且有点搞砸了数据库服务器(至少,我们认为)。明天早上可以在工作日开始之前尝试一下;)
    【解决方案2】:
    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多