MS-Access查询以在特定条件下排除匹配的行

时间:2014-02-20 20:54:20

标签: sql ms-access

假设我的公司生产链轮和小工具。每种都有两种不同的类型。

表A

Product          ProductLine
Widget1          Widget
Widget2          Widget
Sprocket1        Sprocket
Sprocket2        Sprocket

还可以说组装小部件和链轮的部件总共有5个。

表B

Part      Product
PartA     Widget1
PartB     Widget2
PartC     Sprocket1
PartD     Sprocket2
PartE     Widget1
partE     Widget2
partE     Sprocket1
PartE     Sprocket2

公司总裁决定停止生产所有链轮。什么MS-Access查询可以返回仅用于生成Sprockets的所有部件的列表?

SELECT Part
FROM B
WHERE NOT EXISTS
(SELECT *
 FROM A
 WHERE A.Product = B.Product
 AND A.ProductLine = "Widget")

返回Widgets行生产中未使用的所有部分,即Sprockets使用的所有部件。但它包括在Widget行中使用的PartE。

SQl不是我的强项。我意识到NOT EXISTS / Widget和EXISTS / Sprocket会给出相同的结果集。我的问题是尝试过滤掉用于Widgets和Sprockets的部件。实际上,有两个以上的ProductLines,所以使用COUNT()= 1的内容并不是很有帮助。

这不是家庭作业。我的公司既不制作Widgets也不制作Sprockets,但这个比喻是100%死的。 :)

感谢。

2 个答案:

答案 0 :(得分:2)

此查询直接指向产品系列,并请求未在窗口小部件生产中使用的所有部件。

select part from tableb 
where part not in (select part from tableb 
                      inner join tablea on tableb.product=tablea.product
                   where tablea.productline='Widget')

http://sqlfiddle.com/#!3/770e7/2

答案 1 :(得分:1)

由于你只需要一个零件清单,我试着简化一下。

 SELECT DISTINCT PART FROM B WHERE PRODUCT LIKE '*SPROCKET*' and PART NOT IN (SELECT PART FROM B WHERE PRODUCT LIKE '*WIDGET*')