Да, вам нужен каталог для обоих запросов, потому что это обычная вещь, которая связывает ваших поставщиков и продукты вместе.
Возможно, я обдумал это.Вот мой ход мыслей.
Структура
create table suppliers (sid int, sname text, address text);
create table parts (pid int, pname text, color text);
create table catalog (sid int, pid int, cost int);
insert into suppliers values (1, 'walmart', ''), (2, 'target', ''), (3, 'amazon', '');
insert into parts values (1, 'ball', 'black'), (2, 'ball', 'white'), (3, 'bat', 'black'), (4, 'bat', 'white');
insert into catalog (sid, pid) values (1, 1), (1, 2), (1, 3), (2, 1), (3, 2);
Выбрать все черные части
select group_concat(pid) as gc from parts p where p.color = 'black';
gc
------
1,3
Выберите все детали, продаваемые черными поставщиками
select c.sid, group_concat(c.pid) as gc
from catalog c inner join parts p on c.pid = p.pid and p.color = 'black'
group by c.sid;
sid gc
----- ------
1 1,3
2 1
Найдите поставщиков, которые поставляют все черные детали
select s.sname
from (
select c.sid, group_concat(c.pid) as gc
from catalog c inner join parts p on c.pid = p.pid and p.color = 'black'
group by c.sid
) a
inner join (
select group_concat(pid) as gc
from parts p where p.color = 'black'
) b on a.gc = b.gc
inner join suppliers s on a.sid = s.sid
sname
--------
walmart
Как и выше, ваш второйзапрос также должен измениться на что-то вроде этого:
2-й запрос
select distinct s.sname
from catalog c
inner join parts p on c.pid = p.pid and p.color = 'black'
inner join suppliers s on c.sid = s.sid
sname
--------
walmart
target
В приведенном выше запросе мы объединяем каталог с частями, чтобы получить все каталогикоторые имеют черные части.Затем мы объединяем результат с поставщиками, чтобы получить название поставщиков.Если поставщик поставляет более одной черной детали, его информация может появляться более одного раза.Таким образом, мы используем разные для получения разных имен.
Пример: http://rextester.com/IDH97131