在当前项目中,我需要对从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。
答案 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]以区分重复项。