2

我有一个用来做一些计算的数据表。计算后的结果数据集如下所示:

+------------+-----------+------+----------+
| id_process | id_region | type | result   |
+------------+-----------+------+----------+
|          1 |         4 |    1 |  65.2174 |
|          1 |         5 |    1 |  78.7419 |
|          1 |         6 |    1 |  95.2308 |
|          1 |         4 |    1 |  25.0000 |
|          1 |         7 |    1 | 100.0000 |
+------------+-----------+------+----------+

另一方面,我有另一个表,其中包含一组用于对计算结果进行分类的范围。范围表如下所示:

 +----------+--------------+---------+
 | id_level | start |  end |  status |
 +----------+--------------+---------+
 |        1 |   0   |   75 |  Danger |
 |        2 |  76   |   90 |  Alert  |
 |        3 |  91   |  100 |  Good   |
 +----------+--------------+---------+

我需要做一个查询,在计算时将相应的“状态”列添加到每个值。目前,我可以将以下字段添加到计算查询中:

select
   ...,
   ...,
   [math formula] as result,
(select status 
   from ranges r
   where result between r.start and r.end) status
from ...
where ...

它工作正常。但是当我有很多行(超过200K)时,计算查询变得很慢。

我的问题是:有一些方法可以在不执行子查询的情况下找到“状态”值?

有人以前做过类似的事情吗?

谢谢

4

1 回答 1

2

是的,您正在寻找子查询并加入:

select s.*, r.status
from (select s.*
      from <your query here>
     ) s left outer join
     ranges r
     on s.result between r.start and r.end

显式joins 通常比嵌套 s 优化得更好select。但是,在这种情况下,ranges表看起来很小,所以这可能不是性能问题。

于 2013-04-19T20:23:37.703 回答