0

使用 SQL Server 2012 Express。我有一个代表键/值对的表。keycol 是表的 PK。当查询参数在表中的两个 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) 上已经有一个聚集索引,我认为您不需要任何 otehr 索引来进行此查询。

于 2012-05-10T00:35:05.680 回答