如何将聚合值添加到SELECT?

时间:2013-03-15 14:42:03

标签: sql oracle10g

我正在从多个表中选择数据,我还需要在这些表上获得最大的“时间戳”。我需要它来创建自定义缓存控件。

tbl_name     tbl_surname
id | name    id | surname
---------    ------------
 0 | John     0 | Doe
 1 | Jane     1 | Tully
  ...          ...

我有以下查询:

SELECT name, surname FROM tbl_name, tbl_surname WHERE tbl_name.id = tbl_surname.id

我需要将以下信息添加到结果集中:

SELECT MAX(ora_rowscn) FROM (SELECT ora_rowscn FROM tbl_name
UNION ALL
SELECT ora_rowscn FROM tbl_surname);

我试图使用UNION,但是我得到错误 - 混合组而不是单组数据 - 或类似的东西,我知道为什么我不能使用联合。

我不想将其拆分为2个调用,因为我需要从DB中获取当前快照的时间戳以进行缓存管理。在select和MAX调用之间,DB可以改变。

这是我想要的结果:

John | Doe   | 123456
Jane | Tully | 123456

其中123456是表tbl_name和tbl_surname的上次更改(插入,更新,删除)的大致时间。

我只读取了对DB的访问权限,因此我无法创建触发器,存储过程,额外的表等...

感谢您的任何建议。

编辑:每个行块分配值* ora_rowscn *。所以在一个表中,这个值每行可以不同。我需要查询中涉及的两个(所有)表的最大值。

2 个答案:

答案 0 :(得分:2)

这里不需要聚合 - 只需在查询中包含ora_rowscn值并取最大值:

SELECT 
  n.name, 
  n.ora_rowscn as n_ora_rowscn,
  s.surname,
  s.ora_rowscn as s_ora_rowscn,
  greatest(n.ora_rowscn, s.ora_rowscn) as last_ora_rowscn
FROM tbl_name n
join tbl_surname s on n.id = s.id

顺便说一句,我已经用ANSI风格取代了旧式连接 - 更好的可读性,恕我直言。

答案 1 :(得分:2)

尝试:

SELECT name, 
       surname, 
       max(greatest(tbl_name.ora_rowscn, tbl_surname.ora_rowscn)) over () as max_rowscn
FROM tbl_name, tbl_surname 
WHERE tbl_name.id = tbl_surname.id