我正在对数据库应用程序进行一些维护工作,我发现,很高兴,即使一个表中的值以外键的样式使用,表上没有外键约束。
我正在尝试在这些列上添加 FK 约束,但我发现,因为表中已经有大量错误数据来自以前的错误,这些错误已经被天真地纠正了,我需要找到没有的行匹配到另一个表,然后删除它们。
我在网上找到了一些此类查询的示例,但它们似乎都提供了示例而不是解释,我不明白它们为什么起作用。
有人可以向我解释如何构造一个查询,该查询返回另一个表中没有匹配的所有行,以及它在做什么,这样我就可以自己进行这些查询,而不是为这个 混乱 中的每个表跑到 SO没有 FK 限制?
原文由 Frosty840 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是一个简单的查询:
关键点是:
LEFT JOIN
被使用;这将从Table1
返回所有行,无论Table2
中是否存在匹配行。WHERE t2.ID IS NULL
子句;这会将返回的结果限制为仅从Table2
返回的 ID 为空的那些行 - 换句话说,在Table2
中 没有 记录来自Table1
的特定 ID---
.Table2.ID
对于来自Table1
的所有记录将返回为 NULL,其中 ID 在Table2
中不匹配。