Microsoft Access 2007中的查询问题

时间:2013-08-12 15:23:33

标签: database ms-access ms-access-2007

我有两个名为Live和认证的表。两个表中都存在一些列,而一些列只存在于一个表中。两个表都有一个名为“macAddress”的字段。这些macAddress值中的大多数在两个表中重叠,但是有一些记录仅存在于一个表中。

我想在认证表中不存在该macAddress时,从Live表中找到带有macAddress的所有行。

这是我到目前为止所尝试的内容:

SELECT Live.*
FROM Live
WHERE macAddress NOT IN
(SELECT macAddress FROM certified);

我也试过左外连接:

SELECT DISTINCT Live.*
FROM Live LEFT OUTER JOIN certified ON Live.macAddress = certified.macAddress
WHERE certified.macAddress IS NULL;

对于这两个查询,我只获得了列标题,但没有Live表中的记录。

1 个答案:

答案 0 :(得分:0)

我在Access 2007中使用下面包含的Livecertified的示例数据检查了此查询。

SELECT DISTINCT Live.*
FROM
    Live
    LEFT OUTER JOIN certified
    ON Live.macAddress = certified.macAddress
WHERE certified.macAddress IS NULL;

查询给了我这个结果集,这是我认为你要求的。

macAddress        some_text
00-0C-29-80-BA-A3 bar

Live

macAddress        some_text
00-0C-29-80-BA-A3 bar
38-60-77-77-D0-D4 foo

certified

macAddress
38-60-77-77-D0-D4

假设您已经验证Live.macAddress中没有certified个值,但这些值不会与您的数据相同的查询返回,那么您可能已macAddress已编入索引,且索引已损坏。在这种情况下,您可以在表中存在Live.macAddress个值,但在索引中找不到它们......它们可能是乱码或完全丢失。因此,当db引擎使用索引从Live检索行时,将不会考虑索引中没有macAddress值的行。

您可以通过...来测试这是否是导致问题的原因。

  1. Run Compact&修复数据库。然后再次尝试查询。
  2. 如果第一个建议无法解决问题,请删除基于macAddress的所有索引并再次尝试查询。
  3. 此外,您应该在执行这些步骤之前制作db文件的备份副本,以防万一出错。

    在我使用Access数据库的经验中,索引损坏很少见,但它可能会发生。紧凑型修理一直为我治愈。无论您是否正在尝试修复腐败,常规Compact都是一种有用的做法。其中一个好处是它更新数据库统计信息,因此数据库引擎具有在决定如何处理查询时使用的最新和最佳信息。从2000年开始使用Access版本,当Access发现数据问题时,运行Compact会自动触发修复。