2

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

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 个调用,因为我需要从数据库获取的当前快照的时间戳来进行缓存管理。在 select 和对 MAX 的调用之间,数据库可能会发生变化。

这是我想要的结果:

John | Doe   | 123456
Jane | Tully | 123456

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

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

感谢您的任何建议。

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

4

2 回答 2

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
于 2013-03-16T13:39:02.123 回答
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 样式替换了您的旧式连接 - 更好的可读性,恕我直言。

于 2013-03-15T14:55:53.390 回答