我有一个数据表,用于进行一些计算。计算后得到的数据集如下所示:
+------------+-----------+------+----------+
| 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 |
+----------+--------------+---------+
我需要做一个查询,在进行计算时为每个值添加相应的“status”列。目前,我可以将以下字段添加到计算查询中:
select
...,
...,
[math formula] as result,
(select status
from ranges r
where result between r.start and r.end) status
from ...
where ...
一切正常。但是当我有很多行(超过200K)时,计算查询会变慢。
我的问题是:有一些方法可以在不执行子查询的情况下找到“状态”值吗?
有人曾经做过类似的事情吗?
由于
答案 0 :(得分: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
显式join
通常比嵌套select
更优化。但是,在这种情况下,ranges
表似乎很小,所以这可能不是性能问题。