【问题标题】:How can I join two tables but only return rows that don't match?如何连接两个表但只返回不匹配的行?
【发布时间】:2011-09-30 14:51:59
【问题描述】:

我有两张表,如下所示:

T1:  ID  |  Date  |  Hour  | Interval
T2:  ID  |  Date  |  Hour

我基本上需要在它们的 ID、日期和时间匹配时加入这些表。但是,我只想返回表 1 中与表 2 中的结果匹配的结果。

我知道这看起来很简单,但我遇到的问题是表 1 中有多行与表 2 匹配(任何给定时间都有多个间隔)。我需要返回所有这些间隔,只要它们不在表 2 中的同一小时内。

示例数据:

T1:  1  |  1/1/2011  |  1  |  1
     1  |  1/1/2011  |  1  |  2
     1  |  1/1/2011  |  2  |  1
     1  |  1/1/2011  |  2  |  2

T2:  1  |  1/1/2011  |  1

我对此的预期结果集将是来自T1 的最后两行。谁能指出我正确的轨道?

【问题讨论】:

    标签: sql ms-access join


    【解决方案1】:

    使用LEFT JOIN 并过滤掉具有非NULL T2 列的行:

    SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.ID = T2.ID
        AND T1.Date = T2.Date AND T1.Hour = T2.Hour
        WHERE T2.ID IS NULL
    

    【讨论】:

    • +1,谢谢你的回答,但我不得不和乔一起去(他的回答快了几分钟)。
    【解决方案2】:
    SELECT T1.*
        FROM T1
        WHERE NOT EXISTS(SELECT NULL
                             FROM T2
                             WHERE T1.ID = T2.ID 
                                 AND T1.Date = T2.Date
                                 AND T1.Hour = T2.Hour)
    

    也可以使用LEFT JOIN

    SELECT T1.*
        FROM T1
            LEFT JOIN T2
                ON T1.ID = T2.ID
                    AND T1.Date = T2.Date
                    AND T1.Hour = T2.Hour
        WHERE T2.ID IS NULL
    

    【讨论】:

    • 感谢您的回复,这两个查询都适用于 MS Access。老实说,我从来不知道你可以将这样的SELECT 语句组合在一起,+1。
    • 实际上,还有一个回应——我选择了第一个选项,WHERE NOT EXISTS 子句。巧妙,我从来不知道你能做到这一点,它工作得很好。
    • 请记住,NOT EXISTS 没有被 Jet/ACE 查询处理器很好地优化,并且不会总是在比较的两侧使用索引(NOT IN 也是如此,对于更大的程度)。因此,随着数据集的增长,您可以看到 NOT EXISTS 版本对性能造成重大影响。 JOIN 版本将始终使用所有可用的索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2020-01-14
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多