2013-12-03 2 views
0

Рассмотрим следующую схему:Как писать запросы с помощью оператора JOIN?

Suppliers(sid: integer, sname: string, address: string) 
Parts(pid: integer, pname: string, color: string) 
Catalog(sid: integer, pid: integer, cost: real) 

Ключевые поля подчеркнуты, а домен каждого поля указывается после имени поля. Таким образом, sid является ключом для поставщиков, pid является ключом для деталей, а sid и pid вместе образуют ключ для Каталога. В каталоге указаны цены, взимаемые за комплектующие, на Поставщики.

Сейчас я пытаюсь решить эту SQL заявление -

Find the sids of suppliers who supply some red part and some green part. 

Я пришел с этим SQL запроса, но не уверен, правильно ли это или нет -

SELECT C.sid 
FROM Parts P, Catalog C 
WHERE P.color = `red' AND P.pid = C.pid 
AND EXISTS (SELECT P2.pid 
FROM Parts P2, Catalog C2 
WHERE P2.color = `green' AND C2.sid = C.sid 
AND P2.pid = C2.pid) 

Есть ли способ, Я могу написать тот же самый запрос, используя оператор JOIN. Существующий оператор меня немного смущает. А какой самый простой способ написать вышеупомянутый запрос?

+0

Зачем использовать? когда вы можете просто «присоединиться к 3 таблицам, тогда где <>' –

ответ

0
SELECT C.sid 
FROM Catalog AS C 
INNER JOIN Parts AS P 
    ON C.pid = P.pid 
INNER JOIN Suppliers AS S 
    ON C.sid = S.sid 
WHERE P.color = `red' AND P.color = `green' 
0

Цель состоит в том, чтобы найти поставщиков (поставщиков), которые поставляют как зеленые, так и красные детали из каталога.

Таким образом, я создаю псевдоним «green» для каталога и его части, а также «красный» псевдоним для каталога, а часть и внутреннее соединение, чтобы гарантировать, что в результирующем наборе будут находиться только поставщики, которые поставляют оба типа деталей ,

Кроме того, для данного поставщика может быть несколько красных и зеленых частей, поэтому я предпочитаю использовать «select different» вместо «select».

SELECT DISTINCT Cr.sid 
FROM Parts Pg, 
    Parts Pr, 
    Catalog Cg, 
    Catalog Cr 
WHERE 
    Cg.sid = Cr.sid 
    AND Cg.pid = Pg.pid 
    AND Cr.pid = Pr.pid 
    AND Pr.color = 'red' 
    AND Pg.color = 'green' 
Смежные вопросы