【问题标题】:Not In access query不在访问查询中
【发布时间】:2023-03-12 09:10:02
【问题描述】:

下面有两张桌子

tblLoc(LocCode) tblData(Item,LocCode)

在 tblData 中,有一个在 tblLoc 中找不到的额外 LocCode。

SELECT D.LocCode
FROM tblData AS D
WHERE D.LocCode NOT IN (SELECT LocCode FROM tblLoc);

我使用这个查询。它很慢。有更好的查询吗?

【问题讨论】:

  • 两个表中有多少条记录?您的 tblData 是否在 LocCode 上有索引?使用 EXISTS 关键字尝试下面的 onedaywhen 解决方案 - Access 通常可以通过这种方式运行得更快(尽管在内部这些查询应该优化到相同的计划,但 Access 不喜欢 IN 操作)。
  • Access/Jet/ACE 对 IN 子查询很好,但不能像普通的旧 IN 一样可靠地优化 NOT IN - 否定有时会导致它无法使用两侧的索引比较..

标签: sql ms-access ms-access-2003


【解决方案1】:

在 tblData 和 tblLoc 之间的 LocCode 上使用 LEFT JOIN。将结果集限制为仅 tblLoc LocCode 为 Null 的那些行。如果您还没有索引,请在 LocCode 上为 tblLoc 添加索引。

SELECT d.LocCode
FROM
    tblData AS d
    LEFT JOIN tblLoc AS l
    ON d.LocCode = l.LocCode
WHERE l.LocCode Is Null;

【讨论】:

    【解决方案2】:

    您所指的关系运算符称为半差分或反连接。在 Access(ACE、Jet 等)中有多种编写反连接的方法:除了你的和 @HansUp 的之外,还有更多:

    SELECT D.LocCode
      FROM tblData AS D
     WHERE D.LocCode <> ALL (SELECT LocCode FROM tblLoc);
    
     SELECT D.LocCode
      FROM tblData AS D
     WHERE NOT EXISTS (
                       SELECT * 
                         FROM tblLoc
                        WHERE D.LocCode = L.LocCode
                      );
    

    我认为后者更好,因为 preciate 的参数在代码中很接近,因此我作为人类更容易阅读和理解。

    HansUp 认为他们的更好,因为它应该比您的更快(但他们可能会和我一起敦促您始终使用您的用例的典型数据进行测试)。

    如何定义“更好”?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2017-07-10
      • 1970-01-01
      相关资源
      最近更新 更多