使用distinct时,从查询返回重复结果

时间:2010-10-29 22:53:00

标签: sql tsql sql-server-2008 pagination duplicates

在当前项目中,我需要对从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

我担心在外部查询中添加一个distinct会导致返回错误的结果数量,我不确定如何解决这个问题。我查询的数据库是MS SQL Server 2008。

2 个答案:

答案 0 :(得分:1)

在发布问题后大约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

答案 1 :(得分:0)

我没有看到DISTINCT在第一个查询中添加任何值的位置。结果是[item_table]。[item_id]和[row_num]。因为[row_num]的值已经不同,所以[item_table]。[item_id]和[row_num]的组合将是不同的。将DISTINCT关键字添加到查询时,不会排除任何行。

在第二个查询中,您的结果将从[row_num]符合条件的子查询返回[item_id]。如果子查询中存在重复的[item_id]值,则最终结果中将存在重复项,但现在您不显示[row_num]以区分重复项。