1

我有两张名为 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 表的记录。

4

1 回答 1

0

我在 Access 2007 中检查了这个查询,其中包含以下示例Live数据certified

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. 在数据库上运行压缩和修复。然后再次尝试查询。
  2. 如果第一个建议没有解决问题,请删除任何基于的索引macAddress并再次尝试查询。

此外,您应该在这些步骤之前制作 db 文件的备份副本,以防万一出现问题。

在我使用 Access 数据库的经验中,索引损坏很少见,但它可能会发生。Compact & Repair 一直为我治愈它。无论您是否尝试修复损坏,例行的 Compact 都是一种有用的做法。附带的好处之一是它可以更新数据库统计信息,因此 db 引擎在决定如何处理查询时可以使用最新和最好的信息。对于自 2000 年以来的 Access 版本,当 Access 发现数据问题时,运行 Compact 会自动触发修复。

于 2013-08-12T16:17:54.400 回答