Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 找到供应每个零件的供应商的SID_Sql_Algebra_Relational - Fatal编程技术网

Sql 找到供应每个零件的供应商的SID

Sql 找到供应每个零件的供应商的SID,sql,algebra,relational,Sql,Algebra,Relational,3表:供应商(sid、sname、地址)、零件(pid、pname、颜色)、目录(sid、pid、成本) 找到供应每个零件的所有供应商的答案是: SELECT C.sid FROM Catalog C WHERE NOT EXISTS ( SELECT P.pid FROM Parts P WHERE NOT EXISTS ( SELECT C1.sid FROM Catalog C1

3表:供应商(sid、sname、地址)、零件(pid、pname、颜色)、目录(sid、pid、成本)

找到供应每个零件的所有供应商的答案是:

SELECT  C.sid
  FROM  Catalog C
  WHERE NOT EXISTS (
     SELECT  P.pid
       FROM  Parts P
       WHERE NOT EXISTS (
         SELECT  C1.sid
           FROM  Catalog C1
           WHERE C1.sid = C.sid
             AND C1.pid = P.pid
         )
     )
有人能给我解释一下这个答案吗?我只是有点迷路了

我听人解释为“寻找不存在的供应商” 一个他们不卖的零件,但我正努力想知道怎么卖

SELECT  C1.sid
           FROM  Catalog C1
           WHERE C1.sid = C.sid
             AND C1.pid = P.pid
         )
实现了这一点

所以如果我有一个

目录表

詹姆斯·哈默

詹姆斯铁砧

詹姆斯|扳手

亨利·哈默

勒罗伊铁砧

零件表

锤子

铁砧

扳手

那么在最里面的子句之后,返回的究竟是什么

是吗

詹姆斯·哈默

詹姆斯铁砧

詹姆斯|扳手

亨利·哈默

勒罗伊铁砧

然后不存在就可以了

詹姆斯|--

亨利|铁砧,扳手

勒罗伊|锤子,扳手


零件表如何减去这些值?抱歉,如果这些问题不太清楚的话,我对SQL还是新手。

这是一个双嵌套的
不存在的查询(不,我通常看到它的名称是这样的),它专门用于回答这种类型的问题,即“所有y都有x是真的吗?”

,其中特别提到了这种技术

首先,在最里面的
SELECT
查询中,您选择的是每个商店携带的零件。然后,使用第一个
NOT EXISTS
子句,您选择的零件不是每个商店都携带的。最后,在外部
notexists
子句中,您选择了为内部
notexists
子句返回空集的存储,这意味着它们包含每个部分

此查询正在运行

警告一句:如果你在使用SQL,集中思考和工作总是很好的,而像接下来的事情那样以线性方式思考会让你很快陷入麻烦。不要养成这种习惯

然而,有时当试图解决这样一个复杂的查询时,将这些事情看作循环会有所帮助

因此,以小提琴中的数据为例,我们有:

suppliers:
sid, name
9, 'AAA'
8, 'BBB'
7, 'CCC'

parts:
pid, name
1, 'wood'
2, 'stone'
3, 'paper'

catalog:
cid, pid, sid
1,1,9
2,2,9
3,1,8
4,1,7
5,2,7
6,3,7
根据这些数据,AAA运输木材和石头,BBB只运输木材,CCC运输木材、石头和纸张

现在让我们逐行浏览查询。我们从
供应商
中进行选择,并决定结果集中包括哪些行,因此从
供应商
中的第一行开始:
9,'AAA'
。我们暂时将这一行称为
S
。我们只会在内部结果集中没有任何内容的情况下包含这一行,所以让我们看一看

suppliers:
sid, name
S => 9, 'AAA'
     8, 'BBB'
     7, 'CCC'
这个结果集是从
部分
中选择的,我们将逐行检查它<当我们这样做时,code>S仍然等于
9,'AAA'
。因此,从
部分的第一行开始:
1,'wood'
。我们现在称这一行为
P
。如果下一级结果集中没有任何内容,我们将只在第一个内部结果集中包含这一行,所以让我们移到那里。记住
S
=
9、'AAA'
P
=
1、'wood'

suppliers:
sid, name
S => 9, 'AAA'
     8, 'BBB'
     7, 'CCC'

parts:
pid, name
P => 1, 'wood'
     2, 'stone'
     3, 'paper'
此最里面的查询正在从“目录”中选择。我们正在查找任何一行,我们将其称为
C
,在
catalog
中,其中
C.sid
等于
S.sid
C.pid
等于
P.pid
。这意味着当前供应商携带部件。我们需要当前供应商不提供的零件,这就是为什么我们反转结果集。我们知道
S
的sid是9,我们知道
P
的pid是1。
C
中是否有与之匹配的行?
C
中的第一行与之匹配,因此我们知道这个结果集不是空的

suppliers:
sid, name
S => 9, 'AAA'
     8, 'BBB'
     7, 'CCC'

parts:
pid, name
P => 1, 'wood'
     2, 'stone'
     3, 'paper'

catalog:
cid, pid, sid
C => 1,1,9 --Match found! Don't include P in outer result set
     2,2,9
     3,1,8
     4,1,7
     5,2,7
     6,3,7
现在跳回到下一个最外层的环。内部结果集不是空的,因此我们知道
1,'wood
将不属于此循环的结果集。因此,我们移动到
部分的下一行,
2,'stone'
。我们更新
P
的值,使之等于此行。我们应该在结果集中包括这一行吗?我们必须使用
P
的新值再次运行内部查询(
S
仍未更改)。因此,我们在
catalog
中查找
sid
等于9且
pid
等于2的任何行。第二行匹配,因此有一个结果集

suppliers:
sid, name
S => 9, 'AAA'
     8, 'BBB'
     7, 'CCC'

parts:
pid, name
     1, 'wood'
P => 2, 'stone'
     3, 'paper'

catalog:
cid, pid, sid
     1,1,9 
C => 2,2,9 --Match found! Don't include P in outer result set
     3,1,8
     4,1,7
     5,2,7
     6,3,7
跳回下一个最外层的环。内部结果集不是空的,因此
2,'stone'
将不属于此循环的结果集

suppliers:
sid, name
S => 9, 'AAA'
     8, 'BBB'
     7, 'CCC'

parts:
pid, name
     1, 'wood'
P => 2, 'stone'
     3, 'paper'

catalog:
cid, pid, sid
     1,1,9 
C => 2,2,9 --Match found! Don't include P in outer result set
     3,1,8
     4,1,7
     5,2,7
     6,3,7
当我们再次检查
3、'paper'
的所有这些时,我们发现
目录中没有具有
sid=9
pid=3
的行。最里面的结果集是空的,因此我们知道在下一个最外面的循环中包含
P
的值

suppliers:
sid, name
S => 9, 'AAA'
     8, 'BBB'
     7, 'CCC'

parts:
pid, name
     1, 'wood'
     2, 'stone'
P => 3, 'paper'

catalog:
cid, pid, sid
     1,1,9 
     2,2,9 
     3,1,8
     4,1,7
     5,2,7
     6,3,7
C => --No match found, include P in outer result set
此时,我们已经浏览了整个
parts
表,因此我们得到了第二个循环的最终结果集,它不是空的,这意味着我们找到了一个
S
不携带的部分,因此我们知道不能将
S
的当前值包含在最终外部循环的结果集中

因此,我们转到
供应商
中的下一行,重新开始整个流程:

suppliers:
sid, name
     9, 'AAA'
S => 8, 'BBB'
     7, 'CCC'

一旦我们到达
S=7,'CCC'
我们将遍历所有这些循环,并且将在内部循环中找到提供的每个p值的匹配项,这意味着第二个循环将有一个空集。我们找不到供应商没有携带的任何零件,因此,
S
的值被添加到结果集中,这意味着他们携带了所有东西

您使用的RDBMS是什么?对不起,我不确定我是否理解这个问题。你是说SQL吗?不,你的数据库是什么?MSSQL或MySQL或任何其他数据库?请仔细查看第二个查询。在哪里