2012-05-09 17 views
0

SQL Server 2012 Expressの使用。 私はキーと値のペアを表すテーブルを持っています。 keycolはテーブルのPKです。 クエリパラメータがテーブルの2つのkeycol値の間にある場合、valcolを見つけるためにテーブルをクエリする最適な方法を見つけようとしています。 私はkeycol = 15を探していれば 'a'を探し、keycol = 20なら 'b'、keycol = 36なら 'c'を探します。PK値間のSQL Serverクエリ最適?

; 
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を書くよりも優れていますか?テーブルに置くべき別のインデックスはありますか?速度が上がると、私はもっと多くのスペースを使っても構いません。これはルックアップ・テーブルなので、リフレッシュの一部として行が毎月追加され、テーブル全体が再作成されます。

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

+0

「36」の代わりに「6」があった場合、どうしたらいいでしょうか?またはあなたが '136'を持っていたら? –

+0

どちらの場合も結果はnullになりますが、これは問題ありません。 – Snowy

答えて

1

私はそれがあるべきだと思う:あなたはすでに主キー(keycol)にクラスタ化インデックスを持っている場合は

... 
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 

、私はあなたがこのクエリの任意のotehrインデックスを必要としないと思います。

関連する問題