Что на самом деле возвращает этот двойной подзапрос, использующий NOT EXISTS для обоих? - PullRequest
0 голосов
/ 08 января 2019

У меня есть SQL-запрос, который я пытаюсь понять, что он делает на простом английском, а не как работает запрос, но я изо всех сил пытаюсь понять. Запрос такой:

SELECT S#
FROM S
WHERE NOT EXISTS
     (SELECT *
      FROM P
      WHERE NOT EXISTS
           (SELECT *
            FROM SP
            WHERE S.S# = SP.S#
            AND   P.P# = SP.P#));

и схема для этого запроса:

S(S#,Sname,Status,City)
P(P#, Pname, Colour, Weight, City)
SP(S#, P#, Qty)

Если S является поставщиком, P является деталью, а SP является таблицей, в которой указан поставщик, который производит какую часть.

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

1 Ответ

0 голосов
/ 08 января 2019

Показать всех поставщиков, которые поставляют ВСЕ существующие детали

Лучший способ понять это маленький пример:

create table s as
select 1 s# from dual union all
select 2 s# from dual union all
select 3 s# from dual;

create table p as
select 1 p# from dual union all
select 2 p# from dual;

create table sp as
select 1 s#, 1 p# from dual union all
select 1 s#, 2 p# from dual union all
select 2 s#, 1 p# from dual;

Теперь S # 1 поставляет P # 1 и 2

S # 2 только P # 1 и

S # 3 ничего

SELECT S#
FROM S
WHERE NOT EXISTS
     (SELECT *
      FROM P
      WHERE NOT EXISTS
           (SELECT *
            FROM SP
            WHERE S.S# = SP.S#
            AND   P.P# = SP.P#));


        S#
----------
         1

Это не самый простой запрос, который можно объяснить, но, возможно, это поможет:

Этот подзапрос

 (SELECT *
  FROM P
  WHERE NOT EXISTS
       (SELECT *
        FROM SP
        WHERE S.S# = SP.S#
        AND   P.P# = SP.P#))

вернуть все products, которые не поставлены поставщиком S.S#.

Таким образом, этот подзапрос возвращает без строк , если поставщик предоставляет все продукты, что делает предикат NOT EXISTS ИСТИНА.

...