2014-10-21 2 views
1
Suppliers(sid: integer, sname: string, address: string) 
Parts(pid: integer, pname: string, color: string) 
Catalog(sid: integer, pid: integer, cost: real) 

Найти имя поставщика, который снабжает каждую деталь?Разница между не существует и за исключением в sql

select s.sname 
from suppliers s 
where NOT EXISTS (select p.pid 
        from parts p 
        where p.color='red' and 
         NOT EXISTS (select c.pid from parts p where c.pid=p.pid and c.sid=s.sid and p.color='red' 
            ) 
       ) 

Правильно ли этот вопрос?

+2

У вас есть ожидаемые результаты? Есть ли ошибка? –

ответ

1

Что-то вроде следующего может быть менее запутанным.

Select s.name 
from suppliers s 
join catalog c on c.sid = s.sid 
join parts p on p.pid = c.pid 
WHERE Not Exists (Select p2.pid from parts p2 where p2.pid = c.pid) 
1

И НЕ СУЩЕСТВУЮТ И ЗА ИСКЛЮЧЕНИЕМ являются функциями состояния.

NOT EXISTS печатает определенную запись или значение атрибута, если внутренний подзапрос не возвращает ни одной строки для этой конкретной записи.

Для примера:

select c.sid 
from catalog c 
where NOT EXISTS (select * 
        from parts p 
        where p.color<>'red' and 
         p.pid=c.pid); 

Этот запрос будет возвращать все SID, которые только поставки красные части.

Принимая во внимание, что КРОМЕ ведут себя как разностный оператор, который работает так же, как мы изучали в теории множеств.

Для примера:

A-B возвращает все строки А, которые не существуют в B.