我正在从多个表中选择数据,我还需要在这些表上获得最大的“时间戳”。我需要它来创建自定义缓存控件。
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 *。所以在一个表中,这个值每行可以不同。我需要查询中涉及的两个(所有)表的最大值。
答案 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