【问题标题】:How to exclude rows that don't join with another table?如何排除不与另一个表连接的行?
【发布时间】:2011-06-01 10:06:50
【问题描述】:

我有两张表,一张有主键,另一张有外键。

我想从主表中提取数据,前提是辅助表没有包含包含它的键的条目。与简单的内连接相反,它只返回通过该键连接在一起的行。

【问题讨论】:

    标签: sql join


    【解决方案1】:

    SELECT <select_list> 
    FROM Table_A A
    LEFT JOIN Table_B B
    ON A.Key = B.Key
    WHERE B.Key IS NULL
    

    加入的完整图片

    来自文章:http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx

    【讨论】:

    • 终于!为什么他们在教科书中没有这些,为什么我在大学的讲师没有这些?!他们使用了世界上最糟糕的解释,与这些解释相差甚远!
    • 这是黄金。我讨厌写一个没有内容但热情洋溢的评论,但是来吧!这是一个很棒的答案。谢谢你,@Pranay Rana。
    • 请为我解释一下,为什么B.Key IS NULL 但我们仍然可以比较A.Key = B.Key
    • @DoNhuVy 很简单,比较是在“ON”子句中,如果没有匹配的行,则在 LEFT 或 RIGHT 连接中,然后连接所有 NULL 的行,然后测试 IS NULL要知道没有匹配的行。 (顺便说一句,这仅适用于您正在测试的字段不是 NULL,即由于其他原因不能具有 NULL)
    • 我正在使用以下查询: SELECT A.* FROM #PurgeFilesListNew A FULL OUTER JOIN #DoNotPurgeFilesListNew B ON A.JobFileId = B.JobFileId AND A.AccountID = B.AccountID WHERE A.JobFileId NULL OR B.JobFileId IS NULL AND A.AccountID IS NULL OR B.AccountID IS NULL 基本上,我在“ON”子句中有两个比较两个值。它工作正常,但查询为那些不匹配的行返回空行。如何解决这个问题?请帮忙
    【解决方案2】:
    SELECT
       *
    FROM
       primarytable P
    WHERE
       NOT EXISTS (SELECT * FROM secondarytable S
         WHERE
             P.PKCol = S.FKCol)
    

    一般来说(NOT) EXISTS 是比(NOT) IN(LEFT) JOIN 更好的选择

    【讨论】:

    • 好吧,他没有发布使用什么 DBRMS,但是在 MySql 中 LEFT JOIN 优于 NOT EXIST
    • @The Scrum Meister:我说得更快了吗?搜索 IN、EXISTS 和 JOIN 以发现语义和逻辑差异...
    • @gbn 抱歉,我认为“更好的选择”是指更快。那么您能否解释一下它以哪种方式是更好的选择? explainextended.com/2009/09/18/…
    • @Scrum Meister:一般来说,任何类型的 JOIN 都可能需要一个 DISTINCT。列表中的 NOT IN 和 null 给出错误。 IN/EXISTS 行为相同。但是,唯一的“安全”构造是(不)存在,除非您喜欢不一致
    【解决方案3】:

    使用“不存在”的左连接:

    SELECT p.*
    FROM primary_table p LEFT JOIN second s ON p.ID = s.ID
    WHERE s.ID IS NULL
    

    【讨论】:

      【解决方案4】:

      另一种解决方案是:

      SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)
      

      【讨论】:

        【解决方案5】:
        SELECT P.*
        FROM primary_table P
        LEFT JOIN secondary_table S on P.id = S.p_id
        WHERE S.p_id IS NULL
        

        【讨论】:

        • 有一个问题.. 如果我们使用条件 P.key = S.key 然后说 where S.key IS NULL ,那么这不是使 P.key 也为空吗?
        【解决方案6】:

        如果您想从“第一表”中选择第二个表中也存在的列,那么在这种情况下,您也可以使用EXCEPT。在这种情况下,列名也可以不同,但​​数据类型应该是一样。

        示例:

        select ID, FName
        from FirstTable
        EXCEPT
        select ID, SName
        from SecondTable
        

        【讨论】:

          【解决方案7】:

          这有助于在 COGNOS 中使用,因为允许在 Cognos 中创建 SQL“Not in”语句,但运行时间太长。我已经手动将表 A 编码为在 Cognos 中作为 A.key“不在”B.key 中加入表 B,但是查询花费的时间太长/5 分钟后没有返回结果。

          对于在 Cognos 中寻找“NOT IN”解决方案的其他人,这就是我所做的。通过选择链接类型在 Cognos 中创建一个使用 LEFT JOIN 连接表 A 和 B 的查询:表 A.Key 在表 B 中具有“0 到 N”值,然后为表 B 添加了一个过滤器(这些对应于 Where 子句) .Key 为 NULL。

          跑得快,像个魅力。

          【讨论】:

            猜你喜欢
            • 2017-12-12
            • 2016-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-16
            相关资源
            最近更新 更多