レイアウトは同じですが、異なるデータが含まれる可能性がある2つのテーブルt1とt2があるとします。
これら2つのテーブルを比較する最良の方法は何ですか?
これを試して:
(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
にパフォーマンスの問題はありません。
集合演算を使用して試すことができます:MINUS
およびINTERSECT
詳細はこちらをご覧ください: http://oreilly.com/catalog/mastorasql/chapter/ch07.html
[〜#〜] aqt [〜#〜] のようなツールを使用して、テーブル間の差分を作成できます。
別のアプローチは、テーブルをテキストファイルにダンプし、 WinMerge のような差分ツールを使用することです。このアプローチでは、最初に複雑なSQLを使用してテーブルを同じレイアウトに変換できます。
高速ソリューション:
SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2
レコードは表示されません...
この種の質問については、それを解釈する多くの方法と多くの異なるアプローチがあるので、あなたが探しているものについて非常に具体的にならなければならないと思います。あなたの質問がそれを正当化しない場合、いくつかのアプローチはハンマーになりすぎます。
最も単純なレベルでは、「テーブルデータはまったく同じかどうか」があります。これは、より複雑なものに進む前に単純なカウント比較で回答しようとする場合があります。
スケールのもう一方の端には、「他のテーブルに同等の行がない各テーブルの行を表示する」または「行が同じ識別キーで異なるデータ値を持つ場所を表示する」があります。
テーブルAとテーブルBを実際に同期する場合は、MERGEコマンドを使用して比較的簡単に同期できます。
dbForge Data Compare for Oracle、データ比較と同期のための** freeGUIツールを試すことができます。すべてのデータベースに対する、または部分的なアクション。
提供されている他の回答のいくつかに加えて、類似しているが異なる構造を持つ可能性のあるテーブルでテーブル構造の違いを調べたい場合は、複数の方法でこれを行うことができます。
最初-Oracle SQL Developerを使用している場合、両方の表でdescribeを実行して比較できます。
descr TABLE_NAME1
descr TABLE_NAME2
Second-最初のソリューションは、列が多い大きなテーブルには理想的ではない場合があります。 2つのテーブル間のデータの違いのみを表示したい場合は、他のいくつかのテーブルで言及されているように、SQLマイナス演算子を使用してジョブを実行する必要があります。
Third-Oracle SQL Developerを使用していて、異なるスキーマを使用して2つの表の表構造を比較する場合、次のことができます。
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 +を使用
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)
お役に立てれば
これを試して、
セッションセットの変更 "_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);
私はこの投稿を参照しました ここをクリック
Oracle SQL開発者を使用して、テーブルをCSV形式にエクスポートしてから、WinMergeを使用して比較を行いました。