#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 Пожалуйста, посмотрите мою недавнюю правку.