2013-03-14 45 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。

相關問題