2010-12-23 113 views
4

在Oracle的兩個結構相同的表之間執行「diff」的最佳方式是什麼?他們有兩種不同的模式(彼此可見)。Oracle中的表「Diff」

感謝,

+2

你有PLSQL Developer之類的工具嗎?它有一個「比較表數據」功能。 – GolezTrol 2010-12-23 00:30:43

回答

4

如果你沒有像PLSQL開發工具,你可以完全外連接兩個表。如果他們有主鍵,則可以在聯接中使用它。這將使您即時查看任一表格中缺失的記錄。 然後,對於兩個表中都存在的記錄,可以比較每個字段。您應該注意到,您不能將null與常規=運算符進行比較,因此檢查是table1.field1 = table2.field1將在兩個字段都爲空時返回false。因此,如果每個字段的值與另一個表中的值相同,或者兩者都爲空,則必須檢查每個字段。

您的查詢可能是這樣的(返回不匹配的記錄):

select 
    * 
from 
    table1 t1 
    full outer join table2 t2 on t2.id = t1.id 
where 
    -- Only one record exists 
    t1.id is null or t2.id is null or 
    (-- The not = takes care of one of the fields being null 
    not (t1.field1 = t2.field1) and 
    -- and they cannot both be null 
    (t1.field1 is not null or t2.field1 is not null) 
) 

你將不得不復制field1的條件爲每個字段。當然,您可以編寫一個函數來比較字段數據,以使您的查詢更輕鬆,但是您應該記住,當您需要比較兩個大型表時,這可能會顯着降低性能。

如果您的表沒有主鍵,則需要交叉連接它們並對每個結果記錄執行這些檢查。您可以通過在每個必填字段上使用完全外連接來加速一點,因爲它不能爲空,因此可以在連接中使用。

4

假設你想在兩個表中的數據(在整個行差異)比較:

SELECT * 
    FROM (SELECT 's1.t' "Row Source", a.* 
      FROM (SELECT col1, col2 
        FROM s1.t tbl1 
        MINUS 
        SELECT col1, col2 
        FROM s2.t tbl2) a 
      UNION ALL 
      SELECT 's2.t', b.* 
      FROM (SELECT col1, col2 
        FROM s2.t tbl2 
        MINUS 
        SELECT col1, col2 
        FROM s1.t tbl1) b) 
ORDER BY 1; 

更多info有關比較兩個表。