【问题标题】:SQL Query to compare要比较的 SQL 查询
【发布时间】:2009-12-15 17:08:39
【问题描述】:

我正在处理一个 Access 数据库,我需要在其中提取几个报告。对于其中一个,我需要比较两个数字列表 List1 和 List2(我都从单独的查询中获得),并且只显示那些在 List1 中但不在 List2 中的数字。

有人可以帮忙吗? 谢谢。

【问题讨论】:

    标签: sql ms-access list compare


    【解决方案1】:

    其他人在 SQL 中提供了一些很好的答案,但您可能希望使用 Access 的一些内置功能。

    当我在查询屏幕中时(在 Access XP/2002 中,但在 Access 2003 中应该相同),我可以单击New,然后有一个Find Unmatched Query Wizard 选项。这将引导您完成一系列对话框,帮助您设置要查找的查询。在执行此向导之前,您需要先定义“List1”和“List2”(来自您的示例)。

    完成此设置后,您将能够看到 Access 如何创建查询,这是一种很好的学习方式。

    【讨论】:

      【解决方案2】:

      您可以使用LEFT OUTER JOIN 来完成此操作

      SELECT T1.val
      FROM table1 T1
      LEFT OUTER JOIN table2 T2 ON T1.Val = T2.Val
      WHERE T2.VAL IS NULL;
      

      【讨论】:

        【解决方案3】:
        SELECT some_value
        FROM table1
        WHERE some_value not in ( select some_value from table2);
        

        【讨论】:

        • 子查询的性能不如左连接。
        • @Sonny Boy:你有证据吗?
        • 检查你的实际执行计划。对您自己的一个表运行以下查询,并根据整个计划检查每个表的实际成本: SELECT some_value FROM table1 WHERE some_value not in ( select some_value from table2) SELECT some_value FROM table1 LEFT JOIN table2 on table1.ID = table2.ID WHERE table2.ID 为空
        • 我刚刚做了:查询具有相似的性能(在一个数据库上为 51% 与 49%;在更大的数据库上为 60% 与 40%),但执行计划完全不同。它们还返回不同的结果: table1.some_value IS NULL 的记录仅在第二个查询中返回。所以,是的,重点。 :-)
        • Jet 不可靠地优化 NOT IN(子查询)以使用标准两侧的索引。我发现 IN 更可靠,并且将使用索引的 IN 更改为 NOT IN 可能会导致无法使用其中一个索引(我通过使用 SHOWPLAN 发现了这一点)。但情况并非总是如此,而且我不知道导致它有时使用索引而不是其他情况的区别是什么(一旦我有了解决方法,我就有更好的事情要做!)。
        【解决方案4】:
        SELECT  *
        FROM    (
                SELECT  number
                FROM    …
                ) query1
        WHERE   query1.number NOT IN
                (
                SELECT  number
                FROM    …
                ) /* query2 */
        

        【讨论】:

        • 子查询的性能不如左连接。
        • 在MS Access,可能。在SQL Server 中,IN 子查询的性能比LEFT JOIN 好得多。
        • 据我所知,IN 在查询性能方面与NOT IN 有着根本的不同。
        • @Heinzi 是正确的,因为 Jet/ACE 使用 IN 比较两侧的索引比使用 NOT IN 更可靠。
        • query2.number 为空时会发生什么?这些可能是我们所知道的电话号码。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多