0

次のように2つの同一のテーブルがあります。

表1

Student#|name|Course1#|Course2#|Course3#
456 abc 12  76  89
789 def 09  13  76
345 ghi 56  34  14

表 2

Student#|name|Course1#|Course2#|Course3#
456 abc 12  76  89
789 def 90  13  76
345 ghi 56  34  14

テーブル 1 には最新のデータが含まれ、テーブル 2 にはテーブル 1 のコピーが保持されます。テーブル 2 はテーブル 1 の更新後に毎回更新され、完全な切り捨てと挿入は必要ありません。これら 2 つのテーブルを比較し、値が変更された行のみを返すクエリを起動したいと考えています。これらの値に基づいて、表 2 の更新を実行できます。

例: テーブル 1 では、学生番号 789 のコース 1# の値が 09 から 90 に変更されていますが、テーブル 2 にはまだ古い値があります。クエリを起動すると、次のような結果が得られます。

Student#|name|Course1#|Course2#|Course3#
789 def 90  13  76
4

2 に答える 2

0

T1 で INSERT、DELETE、UPDATE のトリガーを作成し、トリガーでダーティ KEYS/行を onather テーブルに配置し、ダーティ トレース テーブルを定期的にチェックします。または、トリガーで T2 を直接更新します。

于 2013-03-15T03:41:28.770 に答える
0

データの 2 つのコピーを保持し、定期的にそれらを同期させようとすることは言うまでもなく、同じデータの 2 つのコピーを持つことはほとんど意味がありません。したがって、前提はかなり疑わしいようです。

次のようなものを探しているようです

UPDATE table2 t2
   SET (course1, course2, course3) = (SELECT course1, course2, course3
                                        FROM table1 t1
                                       WHERE t1.student = t2.student)
 WHERE EXISTS( SELECT 1
                 FROM table1 t1
                WHERE t1.student = t2.student
                  AND (   t1.course1 != t2.course1
                       OR t1.course2 != t2.course2 
                       OR t1.course3 != t2.course3) );

これは、いずれかのテーブルにNULL値がある場合を考慮していません。の値を NULL 以外のNULL値で置き換えたい場合(利用可能な場合)、-1 がその列の有効な値ではないと仮定すると、句の述語は次のように変更されます。table2table1EXISTSt1.course1 != nvl(t2.course1, -1)

于 2013-03-14T21:35:08.877 に答える