【问题标题】:SQL Query in Access - Record still appearing even though it does not match criteriaAccess 中的 SQL 查询 - 记录仍然出现,即使它不符合条件
【发布时间】:2014-11-03 01:14:18
【问题描述】:

我几乎可以肯定我的 SQL 代码的问题非常轻微,但我一直试图让这个查询正确运行几个小时,但无济于事。我有一个包含 3 列的表:制造商、模型和类型。我正在尝试编写一个查询,输出生产“PC”或“笔记本电脑”的“制造商”,但不输出“打印机”。我将在下面发布我的代码。

SELECT DISTINCT Product.maker
FROM Product
WHERE (((Product.type)="pc" Or (Product.type)="laptop")) AND ((Product.type)<>"printer");

这是一个小得多的修改表,类似于我正在使用的表:

maker   model   type
 A      1001    pc
 A      1002    pc
 C      1007    pc
 D      1008    pc
 E      2003    laptop
 A      2004    laptop
 E      3003    printer
 D      3005    printer
 H      3006    printer

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 这个查询的输出是什么?
  • “H”是否出现在您的查询中?因为正如所写的那样,“E”和“D”会出现,因为它们也会产生“打印机”以外的东西。
  • 我很抱歉。我完全忽略了那部分。 “H”没有出现,但“E”和“D”出现了,因为它们生产的不是打印机。我也需要消除这些。
  • 您还需要更清楚地使用标签。您使用的是 MySQL 还是 MS Access?
  • 很抱歉。我是这个网站的新手,我相信你已经注意到了。我正在使用 MS Access。我更正了。

标签: sql ms-access


【解决方案1】:

您可以为此使用NOT EXISTS

SELECT DISTINCT P.maker
FROM Product P
WHERE (P.type="pc") Or (P.type="laptop")
AND NOT EXISTS
( SELECT 1 FROM Product P1
  WHERE P.maker = P1.maker
  and P1.type ="printer"
)

【讨论】:

  • 谢谢!这就是我一直在寻找的。​​span>
【解决方案2】:

这是“set-within-sets”查询的示例。我喜欢使用聚合和having 子句来处理这些查询。在你的情况下:

SELECT p.maker
FROM Product as p
WHERE SUM(iif(p.type in ("pc", "laptop"), 1, 0)) > 0 AND
      SUM(iif(p.type = "printer", 1, 0) = 0;

第一个条件计算“pc”或“laptop”产品的数量,并且至少需要一个。第二个计算打印机的数量,并要求没有。

这种结构非常灵活,适用于各种条件。

【讨论】:

  • 谢谢!了解这一点当然也有好处。
猜你喜欢
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多