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を使用しようとしましたが、エラー(単一グループのデータではなく、グループの混合)などが発生し、ユニオンを使用できない理由がわかります。

キャッシュ管理のためにDBから取得した現在のスナップショットのタイムスタンプが必要なため、これを2つの呼び出しに分割したくありません。また、selectとMAXの呼び出しの間で、DBが変更される可能性があります。

これが私が望む結果です:

John | Doe   | 123456
Jane | Tully | 123456

ここで、123456は、テーブルtbl_nameおよびtbl_surnameの最後の変更(挿入、更新、削除)のおおよその時刻です。

DBへの読み取り専用アクセス権を持っているため、トリガー、ストアドプロシージャ、追加のテーブルなどを作成できません。

提案をありがとう。

編集:値*ora_rowscn*は行のブロックごとに割り当てられます。したがって、1つのテーブルでは、この値は行ごとに異なる可能性があります。クエリに関係する両方の(すべての)テーブルからの最大値が必要です。

4

2 に答える 2

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 に答える
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 に答える