2017-10-28 101 views
0

我有兩個用戶表,大致看起來像這樣。比較兩個表並插入不完全匹配的行

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_old包含ID電子郵件哈希。然而 - 用戶表在最後包含相同的條目+新條目,並且一些原始條目具有不同的散列+鹽。

什麼我希望做的是從用戶表中添加新條目更新users_old表,看看哪些項目有不同的hash +鹽組合,並添加那些在餐桌上也可作爲一個新的結尾?入境(即使電子郵件是相同的,所以最終的結果應該只是一個表

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

謝謝,戈登。只是爲了澄清 - '從users_old選擇1'這一行並不意味着它只會檢查一行?有多行可能有不同的散列/鹽 – kokozz

+1

@kokozz。 。 。 '1'是任意的。 'not exists'正在檢查是否有*行*被返回。它沒有考慮行中的值。 –

+0

只是試了一下。完美的作品。謝謝你的幫助! – kokozz

相關問題