oracle diff:如何比较两个表?

问题描述 投票:28回答:12

假设我有两个表,t1和t2,它们的布局相同但可能包含不同的数据。

区分这两个表的最佳方法是什么?

oracle diff
12个回答
50
投票

试试这个:

(select * from T1 minus select * from T2) -- all rows that are in T1 but not in T2
union all
(select * from T2 minus select * from T1)  -- all rows that are in T2 but not in T1
;

没有外部工具。 union all没有性能问题。


0
投票

除了提供的其他一些答案之外,如果您想查看表结构与可能具有相似但不同结构的表的差异,您可以通过多种方式执行此操作:

首先 - 如果使用Oracle SQL Developer,您可以在两个表上运行描述来比较它们:

descr TABLE_NAME1
descr TABLE_NAME2

第二 - 对于具有大量列的较大表,第一种解决方案可能并不理想。如果您只想查看两个表之间数据的差异,那么正如其他几个表所述,使用SQL Minus运算符应该可以完成这项工作。

第三 - 如果您使用的是Oracle SQL Developer,并且希望使用不同的模式比较两个表的表结构,则可以执行以下操作:

  1. 选择“工具”
  2. 选择“数据库差异”
  3. 选择“源连接”
  4. 选择“目的地连接”
  5. 选择要比较的“标准对象类型”
  6. 输入“表名”
  7. 单击“下一步”直到“完成”
  8. 点击“完成”
  9. 注意:在步骤3和4中,您可以选择要比较的对象存在的不同模式。

第四 - 如果要比较的表两个表有更多的列,在同一模式中,不需要比较两个以上的表,并且使用DESCR命令在视觉上进行比较没有吸引力,您可以使用以下内容来比较差异表结构:

select 
     a.column_name    || ' | ' b.column_name, 
     a.data_type      || ' | ' b.data_type, 
     a.data_length    || ' | ' b.data_length, 
     a.data_scale     || ' | ' b.data_scale, 
     a.data_precision || ' | ' b.data_precision
from 
     user_tab_columns a,
     user_tab_columns b
where 
     a.table_name = 'TABLE_NAME1' 
and  b.table_name = 'TABLE_NAME2'
and  ( 
       a.data_type      <> b.data_type     or 
       a.data_length    <> b.data_length   or 
       a.data_scale     <> b.data_scale    or 
       a.data_precision <> b.data_precision
     )
and a.column_name = b.column_name;

0
投票

我使用Oracle SQL开发人员将表格导出为CSV格式,然后使用WinMerge进行比较。


0
投票

试试这个,

alter session set“_convert_set_to_join”= true;

另一种方法是手动重写SQL查询[用NOT IN子查询替换减号运算符]证明执行时间提高了30%。

 select * 
   from A 
    where (col1,col2,?) not in 
   (select col1,col2,? from B) 
   union all 
   select * from B 
  where (col1,col2,?) not in 
  (select col1,col2,? from A); 

我从这篇文章中提到了click here


13
投票

您可以尝试使用set操作:MINUSINTERSECT

有关详细信息,请参见此处:http://oreilly.com/catalog/mastorasql/chapter/ch07.html


5
投票

您可以使用像AQT这样的工具在表之间创建差异。

另一种方法是将表转储到文本文件并使用像WinMerge这样的diff工具。使用此方法,您可以首先使用复杂的SQL将表转换为相同的布局。


2
投票

对于这类问题,我认为你必须对你正在寻找的东西非常具体,因为有很多方法可以解释它和许多不同的方法。如果你的问题不能保证的话,有些方法会变得太大了。

在最简单的层面上,“表数据是否完全相同?”,您可能会尝试通过简单的计数比较来回答这些数据,然后再进行更复杂的事情。

在比例的另一端,“向我显示每个表中的行,在另一个表中没有等效的行”或“向我显示行具有相同的标识键但不同的数据值”。

如果您确实希望将表A与表B同步,那么使用MERGE命令可能相对简单。


2
投票

您可以尝试dbForge Data Compare for Oracle,一个用于数据比较和同步的**免费GUI工具,可以对所有数据库或部分数据库执行这些操作。


2
投票

快速解决方案

SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2

没有记录应该显示......


1
投票

如果您有一些钱可以使用,请使用PowerDIFF for Oracle:http://www.orbit-db.com。它带有许多比较选项,可以很好地完成这些类型的工作。


0
投票

select * from table1 where table1.col1 in (select table2.col1 from table2)

假设col1是主键列,这将使table1中的所有行分别对应于table2列1。

select * from table1 where table1.col1 not in (select table2.col1 from table2)

希望这可以帮助


0
投票

尝试:

select distinct T1.id
  from TABLE1 T1
 where not exists (select distinct T2.id
                     from TABLE2 T2
                    where T2.id = T1.id)

用sql oracle 11g +

© www.soinside.com 2019 - 2024. All rights reserved.