不在访问查询中

时间:2011-09-08 08:17:55

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

我有两张桌子

tblLoc(LocCode) tblData(项目,LocCode)

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

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

我使用此查询。这很慢。有没有更好的查询?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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
                  );

我认为后者更好,因为预先设定的参数接近代码,因此我更容易阅读和理解。

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

如何定义'更好'?