Предложение Where для всех элементов в списке

#mysql #sql

Вопрос:

У меня есть таблица ОТГРУЗКИ, как показано ниже.

выберите Отправитель,Детали из ОТГРУЗКИ

Шипперно Части
S1 Р1
S1 Р2
S1 Р3
S1 Р4
S2 Р1
S2 Р2
S3 Р1
S4 Р2
S4 Р3

Мне нужно найти всех грузоотправителей, которые отправляют ВСЕ детали, отправленные S2.

выберите детали из ОТГРУЗКИ, где ShipperNo=’S2′

было бы

Части
Р1
Р2

Я не уверен, как выполнить пересечение между двумя вышеперечисленными подзапросами и получить отправку. Я не обязательно администратор базы данных, который ежедневно использует SQL, и этот вопрос поставил меня в тупик во время интервью, я скорее разработчик полного стека с базовыми знаниями SQL.

Edit1:Я забыл упомянуть, что интервьюер попросил меня сделать это без использования графа.

Комментарии:

1. Я не понимаю, у вас есть доставка прямо там.

2. ^ тот же вопрос… вместо этого вы говорите, что вам нужно найти всех других грузоотправителей, которые отправляют те же самые товары, что и грузоотправитель S2?

3. Я думаю, что вы, должно быть, что-то пропустили в своем описании требования или, может быть, это так просто, как select ShipperNo,Parts from SHIPMENT WHERE ShipperNo = 'S2'

4. Да, альтернативный способ сформулировать вопрос-найти всех других грузоотправителей, которые отправляют те же самые товары, что и грузоотправитель S2.

5. @пользователь2977259 select ShipperNo,Parts from SHIPMENT where parts in (select Parts from SHIPMENT where ShipperNo='S2');

Ответ №1:

Подсчитайте для каждого грузоотправителя количество деталей, которые он объединяет с S2, а затем отфильтруйте те, у которых точно такое же количество деталей, как у S2:

 select SH1.ShipperNo, count(*) partsCount  from shipment SH1  where SH1.Parts in (select SH2.Parts from SHIPMENT SH2 WHERE SH2.ShipperNo = 'S2')  group by SH1.ShipperNo having count(*) = (select count(*) from SHIPMENT SH3 WHERE SH3.ShipperNo = 'S2')  

Комментарии:

1. Извините, я забыл упомянуть, что интервьюер попросил меня сделать это без подсчета голосов. Я смог сделать это и с графом. Позвольте мне добавить эту информацию к вопросу.

Ответ №2:

Вы можете использовать self — join с подзапросом:

Изменить: решение без count функции, согласно деталям в вопросе:

 with sub_s2(id, c) as (  select s.shipperno, sum(s.shipperno != s1.shipperno and s1.shipperno = 'S2') from shipment s   join shipment s1 on s.parts = s1.parts   group by s.shipperno ) select s.id shipperno from sub_s2 s where s.c = (select sum(s3.shipperno = 'S2') from shipment s3)  

Выход:

 shipperno --------- S1  

Комментарии:

1. Извините, я забыл упомянуть, что они просили сделать это без графа. Я смог сделать это и с графом. @Ajax1234

2. @user2977259 Пожалуйста, посмотрите мою недавнюю правку.