比较两个表并插入不完全匹配的行
问题描述:
我有两个用户表,大致看起来像这样。比较两个表并插入不完全匹配的行
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
);
谢谢,戈登。只是为了澄清 - '从users_old选择1'这一行并不意味着它只会检查一行?有多行可能有不同的散列/盐 – kokozz
@kokozz。 。 。 '1'是任意的。 'not exists'正在检查是否有*行*被返回。它没有考虑行中的值。 –
只是试了一下。完美的作品。谢谢你的帮助! – kokozz