2017-10-28 20 views
0

私はこのようにおおよそ見える2つのユーザーテーブルを持っています。2つのテーブルを比較し、完全に一致しない行を挿入する

users_old  
| id | email   | hash | salt | 
+----+----------------+------+------+ 
| 1 | [email protected] | 1234 | abc | 
| 2 | [email protected] | 5678 | def | 
| 3 | [email protected] | 9123 | ghi | 
| 4 | [email protected] | 4567 | jki | 

users 
| id | email   | hash | salt | 
+----+----------------+------+------+ 
| 1 | [email protected] | 1234 | abc | 
| 2 | [email protected] | 8662 | zsq | <--- different 
| 3 | [email protected] | 9123 | ghi | 
| 4 | [email protected] | 4567 | jki | 
| 5 | [email protected] | 8912 | xrz | <--- new 

あなたはusers_oldIDメールハッシュが含まれていることを見ることができるように。ただし、ユーザーのテーブルには、同じエントリ+最後に新しいエントリが含まれ、元のエントリのいくつかは異なるハッシュ+ソルトを持ちます。

は、私は何を探していることはユーザーテーブルから新しいエントリを追加することによって、users_oldテーブルを更新し、異なるハッシュ+塩の組み合わせを持っているエントリが表示され、新しいとしても、テーブルの最後にそれらを追加することです。?エントリ(電子メールが同じであっても最終結果はこれを可能にすることができ、単一のクエリがあるただ一つのテーブル

users_old  
| id | email   | hash | salt | 
+----+----------------+------+------+ 
| 1 | [email protected] | 1234 | abc | 
| 2 | [email protected] | 5678 | def | 
| 3 | [email protected] | 9123 | ghi | 
| 4 | [email protected] | 4567 | jki | 
| 5 | [email protected] | 8912 | xrz | 
| 6 | [email protected] | 8662 | zsq | 

する必要がありますので

答えて

0

私は、あなたがしたいと思う:

insert into users_old(email, hash, salt) 
    select email, hash, salt 
    from users u 
    where not exists (select 1 
         from users_old uo 
         where uo.email = u.email and uo.hash = u.hash and 
          uo.salt = u.salt 
        ); 
+0

ありがとう、ゴードン。明確にするために、 'select 1 from users_old'という行は、1行だけをチェックするという意味ではありませんか?異なるハッシュ/塩を持つ可能性がある複数の行があります – kokozz

+1

@kokozz。 。 。 「1」は任意である。 'not exists'は、* rows *が返されたかどうかを調べることです。行の値は考慮していません。 –

+0

ちょうどそれを試してみました。完璧に動作します。ご協力いただきありがとうございます! – kokozz

関連する問題