假设我的公司生产链轮和小工具。每种都有两种不同的类型。
表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%死的。 :)
感谢。
答案 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')
答案 1 :(得分:1)
由于你只需要一个零件清单,我试着简化一下。
SELECT DISTINCT PART FROM B WHERE PRODUCT LIKE '*SPROCKET*' and PART NOT IN (SELECT PART FROM B WHERE PRODUCT LIKE '*WIDGET*')