这个使用 NOT EXISTS 的双重子查询实际上是什么 return?

What does this double subquery using NOT EXISTS for both actually return?

我有一个 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 是 table 列出哪个供应商生产哪个零件。

我目前的理解是 returns 所有不生产任何零件的供应商编号,但我不知道这是否正确。

显示供应所有现有零件的所有供应商

最好的理解方式是小例子:

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#))

return 所有 products 未由供应商 S.S# 提供

所以这个子查询 return 没有行 以防供应商提供所有产品,这使得 NOT EXISTS 谓词为真。