如何在另一个表中选择没有匹配条目的行?
我正在做一些数据库应用程序的维护工作,并且我发现,尽管来自一个表的值是以外键的形式使用的,但喜悦的欢乐,这些表上没有外键约束。
我试图在这些列上添加FK约束,但是我发现,由于以前的错误已经被天真地纠正过,表中已经存在整个负载错误的数据,我需要找到那些不需要的行匹配到另一个表,然后删除它们。
我在网上发现了这种查询的一些例子,但它们似乎都提供了例子而不是解释,我不明白它们为什么起作用。
有人可以向我解释如何构建一个查询,该查询返回所有在另一个表中没有匹配的行,以及它在做什么,以便我可以自己做这些查询,而不是针对此混乱中的每个表都运行到SO没有FK限制?
这是一个简单的查询:
SELECT t1.ID
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL
关键点是:
LEFT JOIN
; 这将返回所有行Table1
,无论是否存在一个匹配的行Table2
。
WHERE t2.ID IS NULL
子句; 这将限制返回的结果仅返回表Table2
返回的ID为空的那些行 - 换句话说, Table2
没有记录来自Table1
特定ID。 Table2.ID
将返回为NULL从所有记录Table1
,其中ID不匹配Table2
。
我会使用EXISTS
表达式,因为它更强大,你可以更准确地选择你想要加入的行,在LEFT JOIN
情况下,你必须把所有加入表中的东西都拿走。 其效率可能与使用空测试的LEFT JOIN
情况相同。
SELECT t1.ID
FROM Table1 t1
WHERE NOT EXISTS (SELECT t2.ID FROM Table2 t2 WHERE t1.ID = t2.ID)
T2
是要添加约束的表:
SELECT *
FROM T2
WHERE constrain_field NOT
IN (
SELECT DISTINCT t.constrain_field
FROM T2
INNER JOIN T1 t
USING ( constrain_field )
)
并删除结果。
链接地址: http://www.djcxy.com/p/94221.html上一篇: How to select rows with no matching entry in another table?