这个使用不存在的双子查询实际上返回了什么



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

目前的理解是,这将返回所有不生产任何零件的供应商编号,但是如果正确,我没有得到。

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

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

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谓词为 TRUE。

相关内容

最新更新