В текущем проекте мне нужно выполнить разбиение на страницы результатов, возвращаемых из SQL. Я столкнулся с угловым случаем, в котором запрос может принимать идентификаторы как часть предложения where, обычно это не проблема, но в одном случае передается один идентификатор, который имеет отношение один ко многим с одним из таблицы, к которым присоединяется запрос, и он возвращает несколько строк в результатах. Эта проблема была исправлена введением отличного в запрос. Ниже приведен запрос, который возвращает правильный результат одной строки (все имена таблиц / полей были изменены, конечно):
select distinct [item_table].[item_id]
, row_number() over (order by [item_table].[pub_date] desc, [item_table].[item_id]) as [row_num]
from [item_table]
join [OneToOneRelationShip] on [OneToOneRelationShip].[other_id] = [item_table].[other_id]
left join [OneToNoneOrManyRelationship] on [OneToNoneOrManyRelationship].[item_id] = [item_table].[item_id]
where [item_table].[pub_item_web] = 1
and [item_table].[live_item] = 1
and [item_table].[item_id] in (1404309)
Однако, когда я ввожу нумерацию страниц в запросе, я обнаруживаю, что теперь он возвращает несколько строк, когда он должен возвращать только одну. Метод, который я использую для нумерации страниц, выглядит следующим образом:
select [item_id]
from (
select distinct [item_table].[item_id]
, row_number() over (order by [item_table].[pub_date] desc, [item_table].[item_id]) as [row_num]
from [item_table]
join [OneToOneRelationShip] on [OneToOneRelationShip].[other_id] = [item_table].[other_id]
left join [OneToNoneOrManyRelationship] on [OneToNoneOrManyRelationship].[item_id] = [item_table].[item_id]
where [item_table].[pub_item_web] = 1
and [item_table].[live_item] = 1
and [item_table].[item_id] in (1404309)
) as [items]
where [items].[row_num] between 0 and 100
Я беспокоюсь, что добавление отличительного к внешнему запросу приведет к неверному количеству результатов, и я не уверен, как еще исправить эту проблему. Запрашиваемая мной база данных - MS SQL Server 2008.