web-dev-qa-db-ja.com

Oracle diff:2つのテーブルを比較する方法は?

レイアウトは同じですが、異なるデータが含まれる可能性がある2つのテーブルt1とt2があるとします。

これら2つのテーブルを比較する最良の方法は何ですか?

29
Mark Harrison

これを試して:

(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にパフォーマンスの問題はありません。

52
L. Holanda

集合演算を使用して試すことができます:MINUSおよびINTERSECT

詳細はこちらをご覧ください: http://oreilly.com/catalog/mastorasql/chapter/ch07.html

13
maxyfc

[〜#〜] aqt [〜#〜] のようなツールを使用して、テーブル間の差分を作成できます。

別のアプローチは、テーブルをテキストファイルにダンプし、 WinMerge のような差分ツールを使用することです。このアプローチでは、最初に複雑なSQLを使用してテーブルを同じレイアウトに変換できます。

5
Aaron Digulla

高速ソリューション:

SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2

レコードは表示されません...

2
Joan Vilariño

この種の質問については、それを解釈する多くの方法と多くの異なるアプローチがあるので、あなたが探しているものについて非常に具体的にならなければならないと思います。あなたの質問がそれを正当化しない場合、いくつかのアプローチはハンマーになりすぎます。

最も単純なレベルでは、「テーブルデータはまったく同じかどうか」があります。これは、より複雑なものに進む前に単純なカウント比較で回答しようとする場合があります。

スケールのもう一方の端には、「他のテーブルに同等の行がない各テーブルの行を表示する」または「行が同じ識別キーで異なるデータ値を持つ場所を表示する」があります。

テーブルAとテーブルBを実際に同期する場合は、MERGEコマンドを使用して比較的簡単に同期できます。

2
David Aldridge

dbForge Data Compare for Oracle、データ比較と同期のための** freeGUIツールを試すことができます。すべてのデータベースに対する、または部分的なアクション。

alt text

1
Devart

提供されている他の回答のいくつかに加えて、類似しているが異なる構造を持つ可能性のあるテーブルでテーブル構造の違いを調べたい場合は、複数の方法でこれを行うことができます。

最初-Oracle SQL Developerを使用している場合、両方の表でdescribeを実行して比較できます。

descr TABLE_NAME1
descr TABLE_NAME2

Second-最初のソリューションは、列が多い大きなテーブルには理想的ではない場合があります。 2つのテーブル間のデータの違いのみを表示したい場合は、他のいくつかのテーブルで言及されているように、SQLマイナス演算子を使用してジョブを実行する必要があります。

Third-Oracle SQL Developerを使用していて、異なるスキーマを使用して2つの表の表構造を比較する場合、次のことができます。

  1. 「ツール」を選択します
  2. 「データベース差分」を選択します
  3. 「ソース接続」を選択します
  4. 「接続先」を選択します
  5. 比較する「標準オブジェクトタイプ」を選択します
  6. 「テーブル名」を入力してください
  7. 「完了」に到達するまで「次へ」をクリックします
  8. 「完了」をクリックします
  9. 注:手順3および4では、比較するオブジェクトが存在する異なるスキーマを選択します。

4番目-比較したい2つのテーブルの列が多く、同じスキーマにあり、3つ以上のテーブルを比較する必要がなく、使用できる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;

試してください:

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 +を使用

0
KingRider

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
Kumar

これを試して、

セッションセットの変更 "_convert_set_to_join" = true;

もう1つの方法は、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); 

私はこの投稿を参照しました ここをクリック

0
Jar Yit

Oracle SQL開発者を使用して、テーブルをCSV形式にエクスポートしてから、WinMergeを使用して比較を行いました。

0
Pasan W.