Sql 如何通过分页获得有序的不同ID?
假设我有两个表:Person和Address。两者都有一个数字“id”列,并且个人记录可以有多个地址。外键“Address.person\u id”引用“person.id” 我现在想 在人员及其地址上使用条件搜索人员 按人员/地址属性对结果排序,以及 返回不同的个人ID 使用分页对行范围的附加限制,按页码和页面大小计算 获取非独特的个人ID非常简单:Sql 如何通过分页获得有序的不同ID?,sql,oracle,hibernate,pagination,Sql,Oracle,Hibernate,Pagination,假设我有两个表:Person和Address。两者都有一个数字“id”列,并且个人记录可以有多个地址。外键“Address.person\u id”引用“person.id” 我现在想 在人员及其地址上使用条件搜索人员 按人员/地址属性对结果排序,以及 返回不同的个人ID 使用分页对行范围的附加限制,按页码和页面大小计算 获取非独特的个人ID非常简单: select p.id from person p left join address a on a.person_id = p.id whe
select p.id from person p
left join address a on a.person_id = p.id
where p.firstname is not null
order by a.city, p.lastname, p.firstname
但是现在我不能只选择distinctp.id,因为我有一个订单,除非我也选择订单条件,否则无法应用该订单
如果我用select DISTICTED from…(选择区分…)包装上面的SQL代码段,我会得到不同的ID,但会丢失顺序ID以任意顺序出现,可能是由于散列
我提出了一个通用但相当不切实际的解决方案,该解决方案可以正常工作,但仍不能满足我的要求。3个外部选择:
select id from (
select id, rownum as r from (
select distinct(ID), min(rownum) from (
select p.id from person p
left join address a on a.person_id = p.id
where p.firstname is not null
order by a.city, p.lastname, p.firstname
)
group by (id)
order by min(rownum)
)
) where r>${firstrow} and r<=${lastrow}
占位符${firstrow}和${lastrow}将替换为根据页码和页面大小计算的值
有没有更好的方法只需要使用
分页
我正在使用Hibernate Criteria API实现这些搜索,我可以在Hibernate中将外部选择实现为投影,还是创建自己的投影实现来实现这一点
你基本上是想按照他们的min地址对这些人进行分类,我不确定这对我来说是否有意义,但它应该只对你有意义。在这种情况下,你可以试试
select person_id
from (
select a.person_id , min(a.city || p.lastname || p.firstname)
from person p left join address a
on (a.person_id = p.id)
where p.firstname is not null
group by a.person_id
order by 2 )
where rownum < x
两个技术说明-
如果每个人都有一个地址,就失去左连接。
如果您使用的是GROUPBY,则不需要指定distinct。
好主意,仅当比较串联字符串时,排序将无法正常工作,尤其是在排序日期、时间戳、数值或某些排序条件递减时。