0

我有两个相同的表如下:

表格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 中进行更新。

例如:在表 1 中,学生#789 的课程 1# 的值从 09 更改为 90,但表 2 仍然具有旧值。当我触发查询时,我应该得到如下结果:

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

2 回答 2

0

拥有相同数据的两个副本几乎没有意义,更不用说尝试保留两个数据副本并定期尝试使它们保持同步。所以这个前提似乎相当可疑。

听起来你正在寻找类似的东西

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 值替换NULLin的值(如果可用),并假设 -1 不是该列的有效值,则子句中的谓词将更改为类似于.table2table1EXISTSt1.course1 != nvl(t2.course1, -1)

于 2013-03-14T21:35:08.877 回答
0

在 T1 上为 INSERT,DELETE,UPDATE 创建触发器,在触发器中将脏 KEYS/行放在另一个表中,然后定期检查脏跟踪表。或者在触发器中直接更新 T2。

于 2013-03-15T03:41:28.770 回答