Sql 找到供应每个零件的供应商的SID
3表:供应商(sid、sname、地址)、零件(pid、pname、颜色)、目录(sid、pid、成本) 找到供应每个零件的所有供应商的答案是: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
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或任何其他数据库?请仔细查看第二个查询。在哪里