为了减少行数,您可以为SecondTable
按 LastCheckDate 排序的每条记录检索前 (100) 行,然后通过临时表或动态 sql 生成的查询将它们合并,最后选择前 (100)。
此解决方案使用游标获取 SecondTable 中每个值的前 100 条记录。使用 TheTable 上的 (TypeID, LastCheckDate) 索引,它会立即运行(在我的系统上使用包含 700,000 条记录和 50 个 SecondTable 条目的表进行测试)。
declare @SomeParam varchar(3)
declare @TypeID int
declare @tbl table (TheTableID int, LastCheckDate datetime, SomeParam float)
declare rstX cursor local fast_forward for
select TypeID, SomeParam
from SecondTable
open rstX
while 1 = 1
begin
fetch next from rstX into @TypeID, @SomeParam
if @@fetch_status <> 0
break
insert into @tbl
select top 100 ID, LastCheckDate, @SomeParam
from TheTable
where TypeID = @TypeID
order by LastCheckDate
end
close rstX
deallocate rstX
select top 100 *
from @tbl
order by DATEDIFF(Day, LastCheckDate, GETDATE()) * SomeParam
显然,此解决方案仅获取 ID。您可能希望使用其他列来扩展临时表。