0

SQL Server2012Expressの使用。キーと値のペアを表すテーブルがあります。keycolはテーブルのPKです。クエリパラメータがテーブル内の2つのkeycol値の間にある場合に、テーブルをクエリしてvalcolを見つける最適な方法を見つけようとしています。したがって、keycol = 15を探している場合は「a」を検索し、keycol=20の場合は「b」を検索します。keycol=36の場合は「c」を検索します。

;
with tblextr ( keycol , valcol )
As
(
   Select 10 , 'a'
   Union All
   Select 19 , 'a'
   Union All
   Select 20 , 'b'
   Union All
   Select 29 , 'b'
   Union All
   Select 30 , 'c'
   Union All
   Select 39 , 'c'
)
select valcol from tblextr 
where keycol = (
   select max(keycol)
   from tblextr
   where keycol <= 36
)

keycolはすでにPKですが、SQLを私が持っているよりもうまく書く方法はありますか?テーブルに置くべき別のインデックスはありますか?速度が上がってもスペースを増やしてもかまいません。これはルックアップテーブルであるため、行は、テーブル全体を再作成する更新の一部として毎月追加されるだけです。

ありがとう。

4

1 に答える 1

1

私はそれがすべきだと思います:

...
SELECT a.valcol 
FROM 
    ( SELECT TOP(1) valcol  
      FROM tblextr
      WHERE keycol <= 36
      ORDER BY keycol DESC
    ) AS a
  JOIN
    ( SELECT TOP(1) valcol  
      FROM tblextr
      WHERE keycol >= 36
      ORDER BY keycol ASC
    ) AS b
    ON b.valcol = a.valcol 

主キー(keycol)にクラスター化インデックスが既にある場合、このクエリに他のインデックスは必要ないと思います。

于 2012-05-10T00:35:05.680 に答える