创建并使用临时表来返回特定行,而不是重复运行查询

时间:2015-07-22 17:02:15

标签: sql sql-server tsql sql-server-2012

我有一个程序,其中重复运行查询以获得单个行号(此处称为"分区")。

declare @partition int = {0}

;with candidates as
(
    select column1, column2,
    ROW_NUMBER() over (order by table1.column1) as RowNumber,
    ...
)
select c.column1, c.column2, 
from candidates c
where c.RowNumber - 1 = @partition

我不是每次想要获取特定行时都运行此查询,而是希望查询写入临时表并在分区为零时返回第一行,并从临时表返回一行如果分区不为零。

我该怎么做呢?可以在一个查询中完成吗?

2 个答案:

答案 0 :(得分:1)

为什么你能这样做。

declare @partition int = {0}

IF @partition <> 0 
;WITH candidates AS 
( 
         SELECT   column1, 
                  column2, 
                  Row_number() OVER (ORDER BY table1.column1) AS rownumber 
         ......
 ) 
SELECT c.column1, 
       c.column2, 
FROM   candidates c 
WHERE  c.rownumber - 1 = @partition 
else
SELECT TOP 1 column1, 
         column2, 
FROM     table1 
ORDER BY table1.column1

答案 1 :(得分:1)

我得到的不是陈述的问题,但为什么不呢

select column1, column2,
...
order by column1 
OFFSET @partition ROWS 
FETCH NEXT 1 ROWS ONLY;

这是一个要缓存的复杂查询吗?

确定缓存

declare @partition int = {0}

IF @partition = 0
begin 
   truncate table TableCache;
   insert into TableCache (column1, column2, rownumber) 
   SELECT column1, column2, 
          Row_number() OVER (ORDER BY table1.column1, column2) AS rownumber 
   ......;
end
select column1, column2 
  from TableCache 
 where rownumber - 1 = @partition; 

如果这是程序,那么读取column1,column2可能会更高效地进入List并从程序中引用它们