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 に答える