使用最新记录加入多个表

时间:2014-02-25 19:09:29

标签: sql oracle

我有3张桌子。 1是FORUM,2是CURRENT,3是ARCHIVE。

  • FORUM包含有关用户发表评论的论坛的元数据,每个论坛有一行。
  • CURRENT包含来自所有论坛的“当前”条目的元数据,每个条目1行。
  • ARCHIVE包含有关所有论坛中“已归档”条目的元数据,每个条目一行。

每个论坛都可以在CURRENT和ARCHIVE表中都有条目。 CURRENT和ARCHIVE完全相同。

FORUM感兴趣的专栏是FORUM_NAMEFORUM_NUMBER

CURRENT和ARCHIVE中感兴趣的列是ENTRY_NUMBERFORUM_NUMBERMOD_DATE

下面的查询返回每个在CURRENT表中有行的论坛的最新MOD_DATE。

select max(c.mod_date), f.forum_name, f.forum__number 
from forum f, current c 
where f.forum_number=c.forum_number
group by f.forum_name, f.forum_number order by max(c.mod_date) desc;

如何配置此选项以查询当前的AND存档表,并为每个论坛返回单个最新的mod_date,而不管哪个表具有该论坛的最新mod_date?

感谢。

2 个答案:

答案 0 :(得分:0)

我会尝试将两个表查询的并集作为内部选择,然后在外部选择中按顺序排列。 Imho这应该是可行的。

答案 1 :(得分:0)

另一个样本,用于更好地对互联网表进行非规范化处理。我会在论坛表中为LatestCurrent和LatestArchive添加两列。当条目被添加到每个相应的条目时,有一个触发器,用相应的最新日期列更新论坛表。您甚至可能需要最新的当前/存档的ID,这样您就可以立即加入这些表,而无需每次查询都执行MAX()。

现在,正如所说,你需要像

这样的东西
select 
      f.forum_name, 
      f.forum__number,
      case when CurMax.maxCurrent >= ArchMax.maxArchive
           then CurMax.maxCurrent
           else ArchMax.maxArchive end as MaxDate,
      case when CurMax.maxCurrent >= ArchMax.maxArchive
           then "Current"
           else "Archive" end as MaxSource
   from 
      forum f
         LEFT JOIN ( select c.forum_number, 
                            max(c.mod_date) maxCurrent
                        from current c
                        group by c.forum_number ) CurMax
            on f.forum_number = CurMax.forum_number
         LEFT JOIN ( select a.forum_number, 
                            max(a.mod_date) maxArchive
                        from archive a
                        group by a.forum_number ) ArchMax
            on f.forum_number = ArchMax.forum_number
   order by
      CurMax.maxCurrent DESC