2013-03-14 78 views
0

我有两个相同的表进行比较,以类似的行如下:如何在两个相同的SQL表

表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的值从09改为90,但表2仍旧有旧值。当我火查询我应该得到类似结果:

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

回答

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值。如果要将table2中的NULL值替换为table1中的非NULL值(如果该值为可用值),并假定-1不是该列的有效值,则EXISTS子句中的谓词将更改为类似于t1.course1 != nvl(t2.course1, -1)的谓词。

0

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

相关问题