【问题标题】:Access- Where and OR not working访问 - 在哪里和或不工作
【发布时间】:2012-10-12 13:19:41
【问题描述】:

我有以下用 MS Access 编写的查询

SELECT DISTINCT Table1.ColumnA, Table1.ColumnB,Table1.ColumnC,Table1.ColumnD,Table1.ColumnE
FROM Table2 
RIGHT JOIN Table1 ON (Table2.ColumnB = Table1.ColumnF) 
WHERE (Table1.ColumnF <>28) OR (Table1.ColumnF<>29)
  1. 尝试使用和不使用括号
  2. 当我只有一个 where 语句时,262 条记录按预期下降到 160 条记录
  3. 当我通过 OR 连接了两个条件时,记录返回到 262,显然没有达到预期的效果。即使第一个条件成立,我也不应该回到 262 条记录。

我的问题是我的查询出了什么问题,尤其是与 WHERE XXX OR XXX?

其次,RIGHT JOIN 语句是否对后续 WHERE 语句的结果有任何影响。

第三,如果我不能将 RIGHT JOIN 和 WHERE 结合起来,那么将条件应用于依赖 RIGHT JOIN 的查询的最佳方式是什么?

感谢任何帮助!

【问题讨论】:

    标签: sql ms-access select join where-clause


    【解决方案1】:

    将 OR 替换为 AND

     WHERE (Table1.ColumnF <>28) AND (Table1.ColumnF<>29) 
    

    【讨论】:

    • 为什么要使用 AND?是不是意味着两个条件都必须满足?在我的情况下,当看到 28 记录应该被省略时,29 main 直到以后的记录才会出现。 @杰森
    • 因为 "(X 28) OR (X 29)" 对于 X 的任何值都是 TRUE,包括 28 和 29。
    • @jacobronniegeorge 如果 ColumnF 为 28,那么您的 WHERE 子句将缩减为 (28 &lt;&gt; 28) OR (28 &lt;&gt; 29),即缩减为 (FALSE) OR (TRUE),这是真的。因此,WHERE 子句不会消除任何行
    • 天哪,那是我的笨蛋不是吗???? @Jason,@Tobsey 更清楚感谢您的帮助。
    【解决方案2】:

    你可以改用这个:

    WHERE Table1.ColumnF Not In (28,29)
    

    这种方法清晰简洁地表达了您的意图。现在您已经解决了ORANDWHERE 条件的问题,这个建议可能看起来不是很有用。但是,请记住,当您有更多这样的条件时。 Not In (28,29,32,40,119) 会比 4 个AND 更容易写和理解。

    【讨论】:

    • 现在基于这个特定的陈述,您将如何合并另一个附加条件,即 G 列为 NUL...如果 G 列为 NULL,则保留该值并且不要省略?
    • 我不明白你在问什么。你是这个意思吗? ... WHERE ColumnG Is Null AND ColumnF Not In (28,29) ... IOW,要返回一行,必须同时满足ColumnG和ColumnF条件?
    • 让我解释一下:我有一个包含 127 条记录的列表,两个相关的列 F 列(所有者 ID1)和 G 列(所有者 ID2)。当且仅当在 F 列中出现 28 或 29,并且在 G 列中没有值,它们才应该被省略。所以从逻辑上讲 1. 检查 F 列是否有 28 或 29 2. 如果确实有 28 或 29,则检查该行的 G 列是否为空,3. 如果为空,则不要省略,4 . 否则省略列 G 中具有值的行
    • 我很难理解。建议您以表格格式提交一个新问题,其中包含一组简短的输入数据和您想要的结果。
    猜你喜欢
    • 2018-09-08
    • 2021-06-30
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多