Sql 如何通过分页获得有序的不同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

假设我有两个表: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
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。
好主意,仅当比较串联字符串时,排序将无法正常工作,尤其是在排序日期、时间戳、数值或某些排序条件递减时。