我有两张相同的表格如下:
表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
答案 0 :(得分: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
中的table2
值替换为table1
中的非NULL值(如果可用),并假设-1不是该列的有效值,则谓词EXISTS
子句中的内容会更改为t1.course1 != nvl(t2.course1, -1)
。
答案 1 :(得分:0)
在T1上为INSERT,DELETE,UPDATE创建触发器,在触发器中将脏的KEYS /行放入onather表中,然后定期检查脏跟踪表。或直接触发更新T2。