データベース値の変更を追跡する2つの履歴テーブルがあり、リビジョンIDを使用して個々の変更を追跡しています。例えば
表1:
rev | A | B
=================
1 | 100 | 'A'
4 | 150 | 'A'
7 | 100 | 'Z'
表2:
rev | C | D
==================
1 | 200 | True
5 | 0 | True
8 | 0 | False
目標は、2つのテーブルを次のようにマージすることです。
rev | A | B | C | D
===============================
1 | 100 | 'A' | 200 | True
4 | 150 | 'A' | 200 | True
5 | 150 | 'A' | 0 | True
7 | 100 | 'Z' | 0 | True
8 | 100 | 'Z' | 0 | False
特定のリビジョンについて、そのリビジョンまたはそれよりも小さい最高のリビジョンに対応する値を使用するという考え方です。
頭に浮かぶSQLクエリは、制約rev1 <rev2で2つのテーブルをクロス結合し、サブクエリを使用して行を選択するようなものです。ここで、指定されたrev2ごとにrev1 = max(rev1)です。このクエリを、rev2とrev1を交換する対応するクエリと結合します。最後に、 rev1=rev2の場所から重複を除外します。
質問は次のとおりです。
- このタイプの結合の名前はありますか?
- SQLでこのタイプの結合を実行するためのイディオムはありますか、それともプログラムで実行する方がよいでしょうか(これは間違いなくはるかに単純で、おそらくより効率的です)。