我有一个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。