2012-06-07 82 views
0

我有兩個Oracle數據庫模式和每個模式具有以下兩個表:從複雜集合父子表的比較數據

1)表T1與列:child_id,PARENT_ID,類型
2)表T2與列:id,屬性,值

如何比較存儲在這兩個模式中的數據並找出任何不匹配(以最佳方式)?這些數據可以是這樣的:

T1: 
1, NULL, 'Fruit' 
2, 1, 'Orange' 
3, 1, 'Apple' 
4, 3, 'Gala' 

T2: 
1, 'Company Name', 'ABC' 
1, 'Dept', 'Fruits' 
2, 'name', 'XX Oranges' 
2, 'color', 'Orange' 
2, 'taste', 'Sweet' 
3, 'name', 'YY Apples' 
3, 'color', 'Red' 
4, 'taste', 'Very Sweet' 

的數據可以存儲高達層次中的任何級別,我想看看是否有任何的不匹配例如'Gala''蘋果'在其他模式中不是'非常甜蜜'。

這兩個模式中的id可以不同。

+0

你能告訴我們你期望的輸出嗎? – Arion

+0

是的,你期望在哪裏存儲它? – matchdav

+0

只要顯示不同,任何類型的輸出都可以。它可以打印在屏幕上,也可以是平面文件或可以是另一張桌子。我知道這是一個相當複雜的問題,但任何提示都可以。 –

回答

1

假設您的模式被稱爲'schema1'和'schema2',您可以使用集合運算符搜索不匹配。此查詢返回任何行代表兩個模式之間的差異:

(
    SELECT * FROM schema1.t1 
    MINUS 
    SELECT * FROM schema2.t1 
) 
UNION ALL 
(
    SELECT * FROM schema2.t1 
    MINUS 
    SELECT * FROM schema1.t1 
); 

第一,這些小的查詢讓你不在schema2.t1在schema1.t1發現所有的行,第二個給那些來自schema2.t1而不在schema1.t1中的 - 將UNION ALL和UNION ALL放在一起會給你所有的不匹配。你可能會發現它更清晰地獨立運行查詢,具體取決於你想要的。

顯然,在上面用't2'代替't2'來查看另一個表的差異。

+0

我沒有提到的一件事是,這兩個模式中的ID可以不同。 –