with rm as
(
select DocumentValue
,PageNumber
,case when StartDesignation = 'D' then 1 else 0 end as IsStart
,row_number() over (order by DocumentValue) as RowNumber
from Metadata
)
,gm as
(
select
DocumentValue as DocumentGroup
,DocumentValue
,PageNumber
,RowNumber
from rm
where RowNumber = 1
union all
select
case when rm.IsStart = 1 then rm.DocumentValue else gm.DocumentGroup end
,rm.DocumentValue
,rm.PageNumber
,rm.RowNumber
from gm
inner join rm on rm.RowNumber = (gm.RowNumber + 1)
)
select d.id, gm.DocumentValue, gm.PageNumber
from Doc d
inner join gm on d.DocumentStartValue = gm.DocumentGroup
Попробуйте использовать запрос выше (может быть, вам также понадобится добавить option (maxrecursion ...)
) и добавить индекс для таблицы DocumentValue для метаданных. Кроме того, это возможно - лучше сохранить соответствующую группу при вставке строк метадата.
UPD : я проверил это и исправил ошибки в моем запросе, а не он работает и дает результат, как в первом вопросе.
UPD2 : И рекомендуемые индексы:
create clustered index IX_Metadata on Metadata (DocumentValue)
create nonclustered index IX_Doc_StartValue on Doc (DocumentStartValue)