在列中按两次排序

时间:2012-05-02 19:53:34

标签: java sql oracle hibernate sorting

假设我们有一个这样的NAME表:

PERSON_ID   PART_TYPE   VALUE

PERSON_IDPERSON的外键引用。

内部PART_TYPE将是FAMILYGIVENPREFIXSUFFIX等值。当然,值将是实际值。

你如何编写一个SQL查询(更不用说Hibernate)来排序PART_TYPEVALUE FAMILY PART_TYPE,然后是VALUE {1}} GIVEN

{1}}

考虑一下这三个人的情景:

PART_TYPE

使用此SQL:

Given3 Family10
Given5 Family10
Given7 Family10

我明白了:

SELECT this_.person_id, name1_.part_type, name1_.value
FROM person this_
LEFT OUTER JOIN name name1_
ON this_.person_id       =name1_.person_id
ORDER BY (
  CASE
    WHEN name1_.PART_TYPE = 'FAMILY'
    THEN 0
    WHEN name1_.PART_TYPE = 'GIVEN'
    THEN 1
  END),
  name1_.VALUE,

我想:

  ID2  FAM Family10
  ID1  FAM Family10
  ID3  FAM Family10
  ID4  GIV Given3
  ID5  GIV Given5
  ID6  GIV Given7

因此,当前状态中那些Family10行的顺序是不确定的 - 它可以是ID1,ID2和ID3的任意组合。我希望它们根据Given值排序。我真的不确定如何做到这一点,即使有多个选择语句。

我想要这样做的原因是因为我想得到那些人ID,我可以在我的头上做一些过滤以获得不同的人ID并在其上做一些分页逻辑,然后实际加载Person(从而减少关于很多SQL调用)。我目前无法更改数据库架构。

1 个答案:

答案 0 :(得分:3)

这与你要求的有点不同,但也许它很有用 - 它给每个人的家庭和名字。

SELECT this_.person_id, family.value as family, given.value as given
FROM person this_
LEFT OUTER JOIN name family
    ON this_.person_id = family.person_id
    and family.PART_TYPE = 'FAMILY'
LEFT OUTER JOIN name given_
    ON this_.person_id = given.person_id
    and given.PART_TYPE = 'GIVEN'
ORDER BY family.value, given.value