比较两个表并插入不完全匹配的行

问题描述:

我有两个用户表,大致看起来像这样。比较两个表并插入不完全匹配的行

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 | 

是有一个单一的查询,可以使这一切成为可能

我想你想:

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