Работа с разными таблицами в SQL-запросах - PullRequest
0 голосов
/ 25 сентября 2018

Я новичок в SQL и все еще учусь писать запросы. У меня есть несколько вопросов о написанных мною кодах, которые в основном касаются использования левого соединения / внутреннего соединения

Поставщики (sid: int, sname: VARCHAR (30), адрес: VARCHAR (50))

Детали (pid: int, pname: VARCHAR (30), цвет: VARCHAR (10))

Каталог (sid: int, pid: int, cost: double)

  1. Найдите имена поставщиков, которые поставляют каждую черную деталь.

    select s.sid, s.sname from Suppliers s, Parts p
       where p.color = 'black'
       having count(p.pid) = 15;
    

У меня вопрос к этомувопрос в том, нужно ли мне иметь поставщиков в любом месте предложения where, чтобы найти поставщиков, которые поставляют каждую черную деталь?

Перечислите имена всех поставщиков, которые поставляют любую черную часть.

 select s.sname from Suppliers s 
      inner join Parts p
      on p.color = 'black';

Это также тот же случай, правильно ли я использую внутреннее соединение или как мне использоватьОбе таблицы в этом вопросе.

Также с этими двумя вопросами мне нужно вообще использовать каталог, так как это может относиться как к поставщикам, так и к частям?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

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

Возможно, я обдумал это.Вот мой ход мыслей.

Структура

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

0 голосов
/ 25 сентября 2018

Да, ваша таблица каталога, при условии правильной вставки данных, является способом достижения того, что вы пытаетесь запросить.Нечего объединять (или напрямую связывать) Части и Поставщики, не имея Каталога.

Давайте возьмем 2-й цветной запрос в качестве одного примера: (Таблица Поставщики не имеет столбца color, поэтому этот столбецне может быть использован для присоединения)

SELECT s.name
  FROM Suppliers s
    INNER JOIN Catalog c ON s.sid = c.sid
    INNER JOIN Parts   p ON c.pid = p.pid
 WHERE p.color = 'black';

Это должно сделать это, но если нет, добавьте ваши схемы таблиц к вопросу.Вы получаете эту информацию, делая SHOW CREATE TABLE Catalog, а затем копируете / вставляете вывод.Затем сделайте то же самое для двух других таблиц.

...