假设我有两个表,t1和t2,它们的布局相同但可能包含不同的数据。
区分这两个表的最佳方法是什么?
试试这个:
(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
没有性能问题。
除了提供的其他一些答案之外,如果您想查看表结构与可能具有相似但不同结构的表的差异,您可以通过多种方式执行此操作:
首先 - 如果使用Oracle SQL Developer,您可以在两个表上运行描述来比较它们:
descr TABLE_NAME1
descr TABLE_NAME2
第二 - 对于具有大量列的较大表,第一种解决方案可能并不理想。如果您只想查看两个表之间数据的差异,那么正如其他几个表所述,使用SQL Minus运算符应该可以完成这项工作。
第三 - 如果您使用的是Oracle SQL Developer,并且希望使用不同的模式比较两个表的表结构,则可以执行以下操作:
第四 - 如果要比较的表两个表有更多的列,在同一模式中,不需要比较两个以上的表,并且使用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;
我使用Oracle SQL开发人员将表格导出为CSV格式,然后使用WinMerge进行比较。
试试这个,
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
您可以尝试使用set操作:MINUS
和INTERSECT
有关详细信息,请参见此处:http://oreilly.com/catalog/mastorasql/chapter/ch07.html
对于这类问题,我认为你必须对你正在寻找的东西非常具体,因为有很多方法可以解释它和许多不同的方法。如果你的问题不能保证的话,有些方法会变得太大了。
在最简单的层面上,“表数据是否完全相同?”,您可能会尝试通过简单的计数比较来回答这些数据,然后再进行更复杂的事情。
在比例的另一端,“向我显示每个表中的行,在另一个表中没有等效的行”或“向我显示行具有相同的标识键但不同的数据值”。
如果您确实希望将表A与表B同步,那么使用MERGE命令可能相对简单。
您可以尝试dbForge Data Compare for Oracle,一个用于数据比较和同步的**免费GUI工具,可以对所有数据库或部分数据库执行这些操作。
快速解决方案
SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2
没有记录应该显示......
如果您有一些钱可以使用,请使用PowerDIFF for Oracle:http://www.orbit-db.com。它带有许多比较选项,可以很好地完成这些类型的工作。
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)
希望这可以帮助
尝试:
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 +