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

我正在做一些数据库应用程序的维护工作,并且我发现,尽管来自一个表的值是以外键的形式使用的,但喜悦的欢乐,这些表上没有外键约束。

我试图在这些列上添加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?

    下一篇: SQL: Selecting rows to delete via joins