【问题标题】:How do I correctly use "Not Equal" in MS Access?如何在 MS Access 中正确使用“不等于”?
【发布时间】:2010-02-05 22:06:26
【问题描述】:

目标:

此查询的目的是选择一列中不存在于不同表的类似列中的所有不同值。

当前查询:

SELECT DISTINCT Table1.Column1
FROM Table2, Table1
WHERE Table1.Column1 <> Table2.Column1 

查询结果:

当我尝试运行此查询时会发生什么情况是进度条几乎立即填满,但它几乎冻结并且据我所知没有做任何其他事情。当我使用 = 符号而不是 时,它会输出相等的值,如果我将 Table2.Column1 替换为实际的实际值,它就可以正常工作。

我只是在输入这个问题时再次运行它,上面的查询这次给了我一个答案,但它包含列的所有 DISTINCT 值,而不是像它应该的那样只对该表唯一的所有值。

关于我做错了什么或在这里遗漏的任何想法?

【问题讨论】:

  • 顺便说一句,可以进行非等连接,但您必须深入 SQL 窗口,因为它无法在 Access QBE 的设计视图中表示。我总是做的是创建一个等值连接,然后转到 SQL 并将连接中的 = 更改为 或 > 或 = 等等。

标签: sql ms-access ms-access-2007


【解决方案1】:

像这样

SELECT DISTINCT Table1.Column1
FROM Table1
WHERE NOT EXISTS( SELECT * FROM Table2
    WHERE Table1.Column1 = Table2.Column1  )

你想要不存在,而不是“不相等”


顺便说一句,你很少想写这样的 FROM 子句:

FROM Table1, Table2

因为这意味着“表 1 中的每一行与表 2 中的每一行的 所有 组合......”通常结果行比你想看到的要多得多。在极少数情况下,您确实想要这样做,更可接受的语法是:

FROM Table1 CROSS JOIN Table2

【讨论】:

  • 谢谢。但是为什么“不等于”对此不起作用?应该如何使用它?
  • 因为“平等”并不意味着您认为的那样。 "Equals" 是一个标量比较运算符,但您需要比较 Set 及其元素。 EXISTS 是允许您将标量扩展到集合的运算符之一。
  • Jet/ACE SQL 不支持交叉连接。
  • 好吧,你让我到了那里,我想我只是从未在 Access 中尝试过。这就是它的稀有程度。
【解决方案2】:

在 Access 中,您可能会发现 Join 更快,除非您的表非常小:

SELECT DISTINCT Table1.Column1
FROM Table1 
LEFT JOIN Table2
ON Table1.Column1 = Table2.Column1  
WHERE Table2.Column1 Is Null

这将从列表中排除与 Table2 匹配的所有记录。

【讨论】:

  • 我能用三张桌子轻松做到这一点吗?我用两张表来说明问题,但实际上我是用三张表来做的。我将 RBarry 的方式与两个单独的 NOT EXISTS 语句一起使用。
  • Barry 的方式固然不错,但对 Access 来说不是那么好,除非时间不重要。是的,三张桌子很容易。可能有必要创建一个子查询,这取决于整个事情的复杂程度。您可能想尝试在查询设计窗口中构建它。您可以通过将字段从一个表拖到下一个表来创建连接,并通过右键单击该行来选择连接类型。否则,请更新您的问题以显示这三个表以及您希望它们一起工作的方式。
  • 其实 Barry 的方式并不需要很长时间,所以我会坚持使用 NOT EXISTS。
  • 如果幸运的话,NOT EXISTS 将使用比较两边的索引。如果你不是,你将拥有一个真正的性能猪。何时使用或不使用索引并不是完全可预测的,并且随着表统计信息的变化,性能可能会发生变化。每当有替代品时,我都会尽量避免使用 NOT EXISTS 和 NOT IN(在这种情况下肯定有)。
【解决方案3】:

我一直在努力获取一个查询以返回表 1 中不存在于表 2 中的字段,并尝试了上面的大部分答案,直到我找到了一种非常简单的方法来获得我想要的结果。

我将表 1 和表 2 之间的连接属性设置为第三个设置 (3)(表 1 中的所有字段以及表 2 中连接字段相等的记录),并在条件字段中放置了 Is Null我正在测试的字段中的表 2 中的查询。效果很好。

感谢以上所有。

【讨论】:

  • 如果切换到 SQL 视图,您会发现这与 Fionnuala 的 LEFT JOIN 答案相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多