Имам таблица с данни, която използвам, за да направя някои изчисления. Полученият набор от данни след изчисленията изглежда така:
+------------+-----------+------+----------+
| 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), заявката за изчисление става бавна.
Моят въпрос е: има някакъв начин да се намери, че "статут" стойност, без да направи този подзапитване?
Някой е работил по нещо подобно преди?
Благодаря
Отговори:
2 за отговор № 1Да, търсите подзаявка и се присъединете:
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
таблицата изглежда доста малка, така че това може да не е проблем с производителността.