MYSQL返回其他数据库表中不存在的行ID列表
我正在把一个旧数据库合并成一个新数据库。在新数据库中,我有四个数据库表:“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不匹配 我知道这在一个查询中应该是可能的,但我似乎不能得到正确的语法。我错在哪里?应该如何写?我最初尝试: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
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