行数を減らすにSecondTable
は、LastCheckDate で並べ替えられた各レコードの上位 (100) を取得し、それらをすべて結合して、最終的に上位 (100) を選択します。これには、一時テーブルまたは動的 SQL 生成クエリを使用します。
このソリューションでは、カーソルを使用して、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 のみをフェッチします。列を追加して一時テーブルを拡張することができます。