-1

假设我有两个表:PersonAddress. 两者都有一个数字 ' id' 列,一个人员记录可以有多个地址(外键 ' Address.person_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

但是现在我不能只选择distinct(p.id),因为我有一个订单,除非我也选择订单条件,否则无法应用。

如果我用 包装上面的 SQL 片段select distinct(id) from (...),我会得到不同id的 s,但会丢失顺序(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} 将替换为根据页码和页面大小计算的值)

  • 有没有更好的方法来获取带有分页的有序不同 ID?

  • 我正在使用Hibernate Criteria API实现这些搜索,我能否以某种方式将外部选择实现为ProjectionHibernate 中的 a ,或者创建我自己的投影实现来执行此操作?

4

1 回答 1

1

你基本上想按他们的最小地址对人进行排序(不确定这对我有什么意义,但它应该只对你有意义)。在这种情况下,您可以尝试

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

几个技术说明 -

  • 如果每个人都有地址就丢了left join
  • 如果您正在使用,则group by无需指定distinct.
于 2013-11-13T13:29:43.050 回答