【问题标题】:What does this double subquery using NOT EXISTS for both actually return?这个使用 NOT EXISTS 的双重子查询实际上返回了什么?
【发布时间】:2019-06-03 09:08:01
【问题描述】:

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

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

【问题讨论】:

  • 愚蠢的问题你有没有运行它来看看它返回了什么?
  • 小记你标记了MysqlOracle 是哪一个
  • 它的 oracle 对不起,我删除了 Mysql 标签,但它实际上并没有返回任何东西,所以我对它应该做什么感到困惑。我收到的查询不是我自己写的。
  • 这个查询应该被禁止,因为它与人们的想法相反;)无论如何加1作为挑战:)

标签: oracle subquery double exists


【解决方案1】:

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

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

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

返回供应商S.S#未提供的所有products

因此,如果供应商提供所有产品,则此子查询返回 no rows,这使得 NOT EXISTSpredicate 为 TRUE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 2017-03-01
    • 1970-01-01
    • 2020-12-27
    • 2013-06-21
    • 2013-12-30
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多