mysql - 查找数据库中丢失的数据

标签 mysql null referential-integrity

我需要找出一些聪明的 MySQL 片段,让我可以轻松查看两个表,表中的 id(如果存在)或 NULL 或空(如果不存在)。

我有一个用户表和一个旧表,除了手动比较之外,我不知道如何使它们一起出现在表中,以便我可以进行比较。我希望看到的是这样的:

+----------------------------+
| user_id | email     | uid  |
| 14      | me@me.com | 26   |
| 16      | ug@ug.com | NULL |
+----------------------------+

我知道有一种方法可以包含 NULL 或空值,但我不确定它是什么。这是到目前为止我的困惑的 SQL 查询,是的,我知道在子选择中进行子选择是可怕的:

select uid from users where mail IN (
    select email from legacy_users where id NOT IN (
        select sourceid from migrate_map_users
    )
);

这里涉及三个表,legacy_users => migrate_map_users => users。中间只是一个连接两者的 m2m。 Legacy_users 和 users 都有一个电子邮件列。以及他们自己的 id 版本。

谢谢大家!

最佳答案

您需要了解join types ,特别是左连接和外连接:

SELECT u.uid, u.mail, lu.id
FROM users u
LEFT OUTER JOIN legacy_users lu 
    ON u.email = lu.mail
WHERE lu.id NOT IN
   (
        SELECT sourceid 
        FROM migrate_map_users
    );

LEFT OUTER JOIN 将确保返回左表中的所有记录,无论右表中是否有对应的记录。

关于mysql - 查找数据库中丢失的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3834572/

相关文章:

PHP 在 for() 循环中从 mysql 获取结果

php - 查询适用于本地主机,但不适用于实时服务器

database-design - 如何处理删除异常?

mysql - 是否为了性能/集中而合并表

mysql - vb.net 如何创建一个变量来计算作为插入和更新进入的条目

java - 如何通过自己的类删除一个对象?

java - 如何在没有冗余代码的情况下消除空参数

sql - null 不在详尽列表中

postgresql - "polymorphism"用于 FOREIGN KEY 约束

sql - 如何清空Apache Derby中的所有表?