Дублирующиеся результаты, возвращаемые из запроса, когда используются разные - PullRequest
0 голосов
/ 30 октября 2010

В текущем проекте мне нужно выполнить разбиение на страницы результатов, возвращаемых из 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.

Ответы [ 2 ]

1 голос
/ 30 октября 2010

Примерно через 5 минут после публикации вопроса возможное решение меня поразит, если я сгруппирую по item_id (и любым критериям сортировки), который должен быть только одним его экземпляром, должен решить проблему. После тестирования это был запрос, который мне оставили:

select [item_id]
from (
      select [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)
      group by [item_table].[item_id], [item_table].[pub_date]
) as [items]
where [items].[row_num] between 0 and 100
0 голосов
/ 30 октября 2010

Я не вижу, где DISTINCT добавляет какое-либо значение в ваш первый запрос.Результатами являются [item_table]. [Item_id] и [row_num].Поскольку значение [row_num] уже отличается, комбинация [item_table]. [Item_id] и [row_num] будет отличной.При добавлении в запрос ключевого слова DISTINCT строки не исключаются.

Во втором запросе ваши результаты будут возвращать [item_id] из подзапроса, где [row_num] соответствует критериям.Если в подзапросе есть дубликаты значений [item_id], в конечных результатах будут дубликаты, но теперь вы не отображаете [row_num], чтобы различать дубликаты.

...