2012-05-09 37 views
0

使用SQL Server 2012 Express。 我有一個代表鍵/值對的表。 keycol是表格的PK。 我試圖找到最佳的方式來查詢表查找valcol,當查詢參數是在表中的兩個keycol值之間。 所以我想找到'a',如果我正在尋找keycol = 15,並且如果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

如果你用'6'代替'36',會發生什麼?或者如果你有'136'? –

+0

然後結果在兩種情況下都是空的,這是可以的。 – Snowy

回答

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)上聚集索引,我不認爲你需要爲這個查詢的任何otehr指數。