我有一个程序,其中重复运行查询以获得单个行号(此处称为"分区")。
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
我不是每次想要获取特定行时都运行此查询,而是希望查询写入临时表并在分区为零时返回第一行,并从临时表返回一行如果分区不为零。
我该怎么做呢?可以在一个查询中完成吗?
答案 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并从程序中引用它们