从持续时间内的多个表中选择记录,并按日期排序

时间:2018-03-08 17:42:33

标签: sql postgresql

我有3个表,即HeroAcademyHeroHeroMission。我想从3个表中选择 academyID 列表。

hero tables

  • 所选的 academyID 必须符合isActive IS truelastSeen BETWEEN :start AND :end
  • 所选的 academyID 列表必须是唯一的(没有重复的academyID)。
  • 最后,学术ID必须由lastSeen在各自的表中订购

我试图寻找更好的解决方案。暂时,我正在使用:(简要示例)

SELECT DISTINCT academyID FROM (
    SELECT academyID, lastSeen FROM HeroAcademy WHERE ... UNION
    SELECT DISTINCT academyID, lastSeen FROM Hero WHERE ... ORDER BY lastSeen UNION
    SELECT DISTINCT academyID, lastSeen FROM HeroMission WHERE ... ORDER BY lastSeen
) ORDER BY lastSeen

有没有更好的解决方案?看来我的查询非常基本且超慢......期待任何天才查询。 ^ _ ^

1 个答案:

答案 0 :(得分:1)

我想你想要:

SELECT DISTINCT ON (academyID) academyID
FROM ( (SELECT DISTINCT ON (academyID) academyID, lastSeen
        FROM HeroAcademy
        WHERE ...
        ORDER BY academyID, lastSeen DESC
       ) UNION ALL
       (SELECT DISTINCT ON (academyID) academyID, lastSeen
        FROM Hero
        WHERE ...
        ORDER BY academyID, lastSeen DESC
       ) UNION ALL
       (SELECT DISTINCT ON (academyID) academyID, lastSeen
        FROM HeroMission
        WHERE ...
        ORDER BY academyID, lastSeen DESC
       )
      ) a
ORDER BY academyID, lastSeen;

注意:

  • 假设没有WHERE子句,这可以利用每个表上(academyId, lastSeen)的索引。
  • 您的查询有两个重复的删除操作 - unionselect distinct两个级别。
  • 我认为DISTINCT ON可以更好地获取最新(或最近)的记录。根据{{​​1}}子句,它可以利用索引。