如何在另一个表中选择没有匹配条目的行?

新手上路,请多包涵

我正在对数据库应用程序进行一些维护工作,我发现,很高兴,即使一个表中的值以外键的样式使用,表上没有外键约束。

我正在尝试在这些列上添加 FK 约束,但我发现,因为表中已经有大量错误数据来自以前的错误,这些错误已经被天真地纠正了,我需要找到没有的行匹配到另一个表,然后删除它们。

我在网上找到了一些此类查询的示例,但它们似乎都提供了示例而不是解释,我不明白它们为什么起作用。

有人可以向我解释如何构造一个查询,该查询返回另一个表中没有匹配的所有行,以及它在做什么,这样我就可以自己进行这些查询,而不是为这个 混乱 中的每个表跑到 SO没有 FK 限制?

原文由 Frosty840 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 345
2 个回答

这是一个简单的查询:

 SELECT t1.ID
FROM Table1 t1
    LEFT JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL

关键点是:

  1. LEFT JOIN 被使用;这将从 Table1 返回所有行,无论 Table2 中是否存在匹配行。

  2. WHERE t2.ID IS NULL 子句;这会将返回的结果限制为仅从 Table2 返回的 ID 为空的那些行 - 换句话说,在 Table2没有 记录来自 Table1 的特定 ID --- . Table2.ID 对于来自 Table1 的所有记录将返回为 NULL,其中 ID 在 Table2 中不匹配。

原文由 AdaTheDev 发布,翻译遵循 CC BY-SA 3.0 许可协议

SELECT * FROM First_table 减去 SELECT * FROM another

原文由 Muhammad Parwej 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进