如何比较两个相同的sql表中的类似行

时间:2013-03-14 21:24:46

标签: sql database oracle10g plsqldeveloper

我有两张相同的表格如下:

表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

2 个答案:

答案 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。