MYSQL返回其他数据库表中不存在的行ID列表

MYSQL返回其他数据库表中不存在的行ID列表,mysql,sql,join,Mysql,Sql,Join,我正在把一个旧数据库合并成一个新数据库。在新数据库中,我有四个数据库表:“task_clone”、“potential_task”、“task”和“task_archive” “task_clone”包含从旧数据库导入的task类型的所有数据库条目,我正在尝试将这些条目分布到新数据库中的其他三个表中。”因此,task_clone'是一个临时表 “任务克隆”包含649个条目。数据结构不容易映射到新数据库,从“task_clone”复制行后,其他三个表条目的总和为566,这意味着“task_clon

我正在把一个旧数据库合并成一个新数据库。在新数据库中,我有四个数据库表:“task_clone”、“potential_task”、“task”和“task_archive”

“task_clone”包含从旧数据库导入的task类型的所有数据库条目,我正在尝试将这些条目分布到新数据库中的其他三个表中。”因此,task_clone'是一个临时表

“任务克隆”包含649个条目。数据结构不容易映射到新数据库,从“task_clone”复制行后,其他三个表条目的总和为566,这意味着“task_clone”中有83个条目尚未映射到新结构

我试图查询“task\u clone”,以确定其他三个表中哪些条目不在“task\u clone”中

所有三个表都包含“task_id”列,这是每个任务条目的唯一id。因此,我应该能够查询数据库并获取“task\u clone”中的所有“task\u id”列,这些列返回的entires与其他三个表中的entires不匹配

我知道这在一个查询中应该是可能的,但我似乎不能得到正确的语法。我错在哪里?应该如何写?我最初尝试:

SELECT task_clone.task_id 
FROM task_clone 
WHERE 
    task_clone.task_id != potential_task.task_id 
    AND task_clone.task_id != task.task_id 
    AND task_clone.task_id != task_archive.task_id;
我还研究了使用两个表执行此操作的其他方法,即从一个表返回不在另一个表中的值,但我找不到一个示例,可以清楚地转换为一个解决方案,该解决方案可用于两个以上的表而不会得到错误消息。谢谢你的阅读

请注意,此问题被标记为重复:此问题与之前专门询问两个表格的问题不同,因为我的问题专门询问如何使用四个表格。针对所引用问题提供的解决方案虽然使用了大致相同的语法,但并没有为4个表的问题提供解决方案。此外,在我的问题中,我清楚地指出,我已经查看了以前处理两个表的堆栈答案,如果没有错误消息,我无法将它们转换为四个

你能用NOT IN吗

 SELECT task_clone.task_id FROM task_clone 
 WHERE task_clone.task_id NOT IN  (SELECT task_id from potential_task)
 AND task_clone.task_id NOT IN  (SELECT task_id from task)
 AND task_clone.task_id NOT IN  (SELECT task_id from task_archive)
我将使用不存在的:

我更喜欢不存在而不是不在子查询中,因为后者不能以直观的方式处理null。如果任何表中的任何task_id为NULL,则外部查询将不返回任何行。这与SQL中NULL的含义一致,但与直觉相反

NOT EXISTS会像您预期的那样处理空值-它们在给定行上不匹配,但不会影响其他行中的结果。

鉴于task_id是所有表中的主键,左连接方法似乎更高效、更简洁:

SELECT tc.*
FROM 
    task_clone tc
    LEFT JOIN potential_task pt ON pt.task_id = tc.task_id
    LEFT JOIN task t ON t.task_id = tc.task_id
    LEFT JOIN task_archive ta ON ta.task_id = tc.task_id
WHERE
    pt.task_id     IS NULL 
    AND t.task_id  IS NULL 
    AND ta.task_id IS NULL 

提示:。。。table1左连接table2,其中table1.column为NULL或只是。。。表1,其中id未插入从表2中选择id是的,但这是两个表,而不是四个表。如果这不能解决问题,我建议您提供示例数据和预期结果。。我建议你读读这篇文章,为那个雷蒙德做准备。我不知道关于meta的建议。我认为问题不在于数据库的结构,而在于查询的结构,因此只发布代码。可能是重复的,谢谢!这解决了我的问题。我不知道不在条款中。谢谢你。它不会让我现在点击接受。我一直收到一条消息说你可以在5分钟内接受。
SELECT tc.*
FROM 
    task_clone tc
    LEFT JOIN potential_task pt ON pt.task_id = tc.task_id
    LEFT JOIN task t ON t.task_id = tc.task_id
    LEFT JOIN task_archive ta ON ta.task_id = tc.task_id
WHERE
    pt.task_id     IS NULL 
    AND t.task_id  IS NULL 
    AND ta.task_id IS NULL