我有两个名为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表中的记录。
答案 0 :(得分: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
值的行。
您可以通过...来测试这是否是导致问题的原因。
macAddress
的所有索引并再次尝试查询。此外,您应该在执行这些步骤之前制作db文件的备份副本,以防万一出错。
在我使用Access数据库的经验中,索引损坏很少见,但它可能会发生。紧凑型修理一直为我治愈。无论您是否正在尝试修复腐败,常规Compact都是一种有用的做法。其中一个好处是它更新数据库统计信息,因此数据库引擎具有在决定如何处理查询时使用的最新和最佳信息。从2000年开始使用Access版本,当Access发现数据问题时,运行Compact会自动触发修复。