比较复杂的父子表集中的数据

时间:2012-06-07 07:42:45

标签: sql oracle compare parent-child

我有两个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可能不同。

1 个答案:

答案 0 :(得分:1)

假设您的模式被称为“schema1”和“schema2”,您可以使用set运算符搜索不匹配。此查询返回的任何行表示两个模式之间的差异:

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

这些迷你查询中的第一个为您提供了schema1.t1中不在schema2.t1中的所有行,第二个为您提供了来自schema2.t1的那些不在schema1.t1中的行 - 放入两个与UNION ALL一起为您提供所有不匹配。您可能会发现独立运行查询更加清晰,具体取决于您的需求。

显然只是在上面用't2'代替't1'来查看另一个表的差异。