这个使用 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
谓词为真。
我有一个 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
谓词为真。