Sql 将一个表的每一列与另一个表的每一列进行比较

Sql 将一个表的每一列与另一个表的每一列进行比较,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我在两个数据库中有两个表,其中一个是通过informatica映射复制的,我不能用其他表的简单插入来替换它,所以我需要查看每一列是否与原始表具有相同的数据。如果我想测试一列,我会: Select column1 from table1 minus Select column1 from table2@dblink 如果我对一个有100列的表的每一列都这样做,那将是浪费时间。我试着比较一下: Select column1,column2,.....column N from table1

我在两个数据库中有两个表,其中一个是通过informatica映射复制的,我不能用其他表的简单插入来替换它,所以我需要查看每一列是否与原始表具有相同的数据。如果我想测试一列,我会:

Select column1
from 
table1
minus
Select column1
from 
table2@dblink
如果我对一个有100列的表的每一列都这样做,那将是浪费时间。我试着比较一下:

Select column1,column2,.....column N
from 
table1
minus
Select column1,column2,.....column N
from 
table2@dblink
但是,即使有一列不匹配,它也会返回所有值。所以我想知道最好的方法是什么,这样我的脚本就可以比较两个表并返回不具有相同值的列

我想到的另一个标准是:

select 
(case when T.column1 <> P.column1 then T.id else null),
...
...
...
from
table1 T,
schema.table1@dblink P
where
T.id=P.id
and T.date>='01-DEC-2012'
and T.date<='10-DEC-2012'
and P.date>='01-DEC-2012'
and P.date<='10-DEC-2012';
我使用date函数来提高性能。

使用oracle

这将为您提供a中存在的所有行,而不是b中存在的所有行

select * from tableb
except 
select * from tablea

这将为您提供存在于b中而不是a中的所有行

甚至不用费心做测试。截断表_B并从表_A插入表_B。如果不希望表_B更改,请将其设置为只读

@gh9.我不知道except是否会这样工作,因为你解释我尝试过的方式,我得到的SQL命令没有正确结束错误,如果我只是使用减号语句运行。这个链接已经有10多年的历史了,lol:本文中的示例使用Oracle Rdb V7.1及更高版本的SQL语言versions@Auguster如果tablea与tableb具有相同的模式,那么它将工作。“他们有相同的模式吗?”这是我的耻辱。减号关键字似乎是甲骨文的except。这个想法仍然应该是一样的。您应该能够从表中选择*减去从中选择*tableb@gh9谢谢,所以看起来我所做的是正确的,但它返回完整的行,然后我必须查看每个记录,看看哪一个不匹配…有没有更简单的方法来找到我计划使用case语句但不匹配的行的哪一列不确定如何进行。我正在通过测试一个表是否获得了正确的数据来测试映射。因此需要进行一个查询,以测试所有列是否获得了正确的值,如果没有,则测试哪一列获得了不匹配的值表中有多少行?这是一次吗?您可以将表提取到文件中,然后对文件进行md5sum。如果md5sum是相同的,您可以放心地假设表是相同的。在完成之前提交了先前的注释。。。。。。表中有多少行?这是一次吗?你认为映射是正确的,你只需要证明它,还是你知道存在映射错误,你需要找到它们?为了证明表匹配,可以将/spool表提取到文件中,然后对文件进行md5sum。如果md5sum是相同的,您可以放心地假设表是相同的。我需要找出是否存在任何不匹配,并证明它,表中有150或更多的列和行,甚至在5天内都将以百万计,因此提取在这里不是一个好方法,我需要找到导致不匹配的原因,这样我就不容易导出并找到不匹配然后回到数据库,找出不匹配的原因,我尝试的是做一个通用查询,在有限的时间内测试整个表。我不知道有什么Oracle魔术会帮你做到这一点-你需要编写代码。首先确定不匹配的行,然后比较列。这表示有一个第三部分工具,具有14天的试用版。
select * from tableb
except 
select * from tablea