2010-02-21 1 views
2

Вот моя схема:SQL: Помощь с вложенными запросами

Поставщики (с.и.д.: целочисленные, SNAME: строка, строка адреса)

части (PID: целое число, PNAME: строка, цвет: строка)

Каталог (с.и.д.: целое число, Pid: целое число, стоимость: реальный)

полужирный указывает первичный ключ.

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

-- get all parts for a given supplier 
SELECT Parts.pid 
FROM Suppliers 
JOIN Catalog ON Catalog.sid = Suppliers.sid 
JOIN Parts ON Parts.pid = Catalog.pid 
WHERE Suppliers.sid = 4; 

-- gets all parts that exist 
SELECT Parts.pid 
FROM Parts 

То, что я хочу сделать, в императивных условиях, что-то вроде этого:

Define result set 
Foreach Supplier: 
    If the list of parts produced by a supplier 
    is equal to the total list of parts, add this supplier to the result set 
Return result set 

Как я могу перевести это в MySQL?

+0

Я собирался предложить глядя в UNION и MINUS ... потом я вспомнил, что MySQL не поддерживает MINUS, поэтому вам придется найти способ подделать его (и там * есть * пути). Но, как правило, я бы сказал, что если вы вычтите список поставщиков из списка «ВСЕ ДЕТАЛИ», и у вас что-то осталось, то этот поставщик не будет поставлять все детали. – FrustratedWithFormsDesigner

ответ

0

Использование:

SELECT s.* 
    FROM SUPPLIER s 
    JOIN (SELECT c.sid, 
       COUNT(c.pid) AS num_parts 
      FROM CATALOG c 
     GROUP BY c.sid) x ON x.sid = s.sid 
    JOIN (SELECT COUNT(*) AS total_parts 
      FROM PARTS) y ON y.total_parts = x.num_parts 
0

Не знаете, как это приводит к MySQL, но что-то вдоль этих линий:

select s.sname, PartCount from (
select s.SID, s.sname, PartCount = sum(p.PID) 
inner join Catalog c on c.SID = s.SID 
inner join Parts p on p.PID = c.PID 
where s.SID = 4 
group by s.SID 
) a 
where PartCount = MAX(PartCount) 

Примечание мечения подзапрос «а» произвольное имя, MSSQL требует имена на его подзапросов по какой-то причине. Не знаю, как это работает в MySQL.

0

Try (непроверенные):

SELECT s.* 
FROM (
    SELECT sid, count(pid) as c 
    FROM Catalog 
    GROUP BY sid) q1 
JOIN Suppliers s ON s.sid = q1.sid 
WHERE q1.c = (SELECT COUNT(*) FROM Parts) 
0

Try:

SELECT Suppliers.sid 
FROM Suppliers 
INNER JOIN 
(SELECT sid, COUNT(pid) as num 
    FROM Catalog 
    GROUP BY sid)as t1 
ON Suppliers.sid = t1.sid 
WHERE t1.num = 
    (SELECT COUNT(pid) FROM Parts) 
Смежные вопросы