4

これは、私が頭を悩ませることができなかったトリッキーな問題です。私は SQL Server 2008 を使用しており、次のようなスパース範囲テーブルがあります。

Range     Profession
-----     ----------
0         Office Worker
23        Construction
54        Medical

次に、これらの範囲内の値を持つ別のテーブルがあります。これら 2 つのテーブルを結合して、指定された値以下の職業値を取得するクエリを作成したいと考えています。だから、私の他のテーブルが次のようになっているとしましょう:

Value
29
1
60

次に、結合が返されるようにします。

Value     Profession
-----     ----------
29        Construction
1         Office Worker
60        Medical

(29>建設では 23 ですが、医療では 54 以下であるため)

実際に範囲テーブルを吹き飛ばしてすべての可能な値を含める以外に、この方法でSQLを自分の意志に曲げさせる方法はありますか?

ありがとうございました。

4

3 に答える 3

4

これを行う最も簡単な方法は、スパース範囲テーブルに別の列を追加することです。

LowRange       HighRange      Profession
   0              22         Office Worker
  23              53          Construction
  54            999999         Medical

次に、次のようなクエリを使用して範囲を取得します (テーブル 2 は 29,1,60 の値を持つテーブルです)。

SELECT Table_2.JoinKey as Value, Table_1.Description as Profession 
  FROM Table_1 INNER JOIN Table_2 
          ON Table_2.JoinKey => Table_1.LowRangeKey 
             AND Table_2.JoinKey <= Table_1.HighRangeKey;
于 2011-06-09T01:50:11.763 に答える
3

CROSS APPLY を使用できます。

select v.Value, p.Profession
from tblValues v
cross apply
   (select top(1) pr.Profession
    from tblProfessionRanges pr
    where pr.Range <= v.Value ORDER BY pr.[Range] DESC) p

max を使用するよりも高速で、max-range を維持する必要はありません。

于 2011-06-09T11:05:59.177 に答える
2

私はあなたの問題を理解していると思います。professionsあなたの値で呼び出されるmap_valsテーブルと、ルックアップ値を含むテーブルを作成しました。それから私はこれを思いついた:

select p.range as `range1`, p.profession, v.value from professions p 
inner join map_vals v ON v.value >= p.range
where p.range = 
      (select max(p3.range) from professions p3 where p3.range <= v.value) 
order by v.value

これらの値を指定すると...

value   
29
0
60
1
23
54

戻り値

range1  profession  value   
0           Office Worker   0
0           Office Worker   1
23          Construction    23
23          Construction    29
54          Medical         54
54          Medical         60

編集:

manfred-sorgで示されているように CROSS APPLY を使用することもできますが、 or が必要でORDER BY DESC、次の結果が得られます。

select v.Value, p.Profession
from tblValues v
cross apply
   (select top(1) pr.Profession
    from tblProfessionRanges pr
    where pr.Range <= v.Value) p

生産する

Value       Profession
----------- --------------------------------------------------
29          Office Worker
1           Office Worker
60          Office Worker

目的の結果を得るには、次のように変更する必要があります。

select v.Value, p.Profession
from tblValues v
cross apply
   (select top(1) pr.Profession
    from tblProfessionRanges pr
    where pr.Range <= v.Value ORDER BY pr.[Range] DESC) p

Value       Profession
----------- --------------------------------------------------
29          Construction
1           Office Worker
60          Medical

ただし、ここで必要な並べ替えにより、 を使用するよりも効率が低下しMAXます。

于 2011-06-09T03:32:17.883 に答える