2017-08-20 13 views
0

テーブルtable_aとtable_bの両方を、両方のテーブルにあるemployee_idカラムを使用して比較する必要があります。 両方のテーブルには、行のミリオンがあります。 3結果を表示する必要があります。私はMySqlで2つのテーブルを比較して差分を表示する必要があります

  1. employee_idはtable_aに存在しますが、table_bには存在しません。
  2. の逆もあります。
  3. 特定のemployee_idが両方のテーブルに存在するが、そのemployee_idの他の列のデータが両方のテーブルで異なる場合があります。これらの行は、データの不一致がある列を示すようにも表示されなければなりません。両方のテーブル内の行数百万があるので、両方のテーブルを迅速に比較できるよう

、プロセスは、高速でなければなりません。 私はクエリを書くためにMySQLサーバを使用しています。

+1

あなたは幸いです、MySQLはかなり速いです... – TGrif

+0

https://stewashton.wordpress.com/2014/02/04/compare-and-sync-tables-tom-kyte-and-を見てください。グループバイアプローチはテーブルを結合し、比較するすべての列と、行がどのソーステーブルから来るのかを示す2つの列を比較し、比較している列で要約し、2つの列間で発生数が異なる箇所を見つけますテーブル。利点は、各テーブルが1回スキャンされることです。インデックス内で比較している列を含めれば、処理が速くなることもあります。 – Mic

+0

あなたの質問は? –

答えて

0

これはかなり難しいが、ここでemployee_id各テーブルに一意であると仮定例である:

select employee_id, 
     (case when max(which) = 'a' then 'A-only' 
      when min(which) = 'b' then 'B-only' 
      else 'both' 
     end) as which, 
     concat_ws(',', 
       (case when count(*) = 2 and not min(col1) <=> max(col1) then 'col1' end), 
       (case when count(*) = 2 and not min(col2) <=> max(col2) then 'col2' end) 
       ) as differences 
from ((select 'a' as which, employee_id, col1, col2 
     from a 
    ) union all 
     (select 'b' as which, employee_id, col1, col2 
     from b 
    ) 
    ) ab 
group by employee_id; 

注このNULL -safe比較演算子を使用すること。

関連する問題