2014-02-20 3 views
0

Предположим, что моя компания производит Sprockets и Widgets. Существует 2 разных типа.Запрос 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 будет работать, чтобы вернуть список всех частей, используемых только в производстве Звездочек?

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

Это возвращает все части, не используемые в производстве линии виджетов, т.е. всех частей, используемых Звездочки. Но он включает PartE, который также используется в линии Widget.

SQl - не мой сильный костюм. Я понимаю, что NOT EXISTS/Widget и EXISTS/Sprocket будут давать одинаковый набор результатов. Моя проблема заключается в том, чтобы отфильтровать части, которые используются как для виджетов, так и для звездочек. На самом деле существует более 2 ProductLines, поэтому использование чего-то по строкам COUNT() = 1 не очень полезно.

Это не домашнее задание. Моя компания не делает ни Widgets, ни Sprockets, но аналогия на 100% мертва. :)

Спасибо.

+0

Есть ли ошибка в вашем SQL, например? часть не является столбцом таблицы a. – wumpz

+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

Поскольку вам нужен только список деталей, я попытался немного упростить его.

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

Спасибо! Пока это хорошо. В фактической таблице насчитывается более 1000 «частей», 120+ «продуктов» и около десятка «товарных линий». Это не быстро, но мне не нужно быстро. –

Смежные вопросы