2

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

PERSON_ID   PART_TYPE   VALUE

并且PERSON_ID是对 的外键引用PERSON

内部PART_TYPE将是诸如FAMILY, GIVEN, PREFIX,SUFFIX等的值。值自然是实际值。

你将如何编写一个 SQL 查询(更不用说 Hibernate)来让 this 按 排序PART_TYPE,然后按VALUEfor排序,FAMILY PART_TYPE然后按VALUEfor排序GIVEN PART_TYPE

考虑一下你有这三个人的场景:

Given3 Family10
Given5 Family10
Given7 Family10

使用此 SQL:

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

我想:

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

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

我想这样做的原因是因为我想获取这些人员 ID,并且我可以在我的末端进行一些过滤以获取不同的人员 ID 并对其执行一些分页逻辑,然后实际加载人员(从而减少很多SQL 调用)。我目前无法更改数据库架构。

4

1 回答 1

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
于 2012-05-02T20:01:00.310 回答