当前位置: 首页 > 面试题库 >

查找供应每个零件的供应商的sid

冯阳华
2023-03-14
问题内容

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的新手。


问题答案:

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

这是MySQL在EXISTS和NOT EXISTS上的页面,其中专门提到了该技​​术。

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

这是该查询的一个SQLFiddle。

一个警告 :如果您正在使用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承载木材,石材和纸张。

现在,让我们逐行浏览查询。我们从选择suppliers,而我们决定在结果集中包括行,因此在第一排发车suppliers9,'AAA'。我们将S暂时称为此行。如果内部结果集中没有任何内容,我们将仅包括该行,因此让我们看一下。

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

该结果集是从中选择的parts,我们将逐行对其进行遍历。
在执行此操作时S仍然等于9,'AAA'。因此,在第一排发车parts1,'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.sidC.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将不属于此循环的结果集。因此,我们移动到下一行parts2,'stone'。我们更新的值P等于此行。我们应该在结果集中包括这一行吗?我们必须使用新的值PS仍未更改)再次运行内部查询。因此,我们在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'不会成为此循环的结果集的一部分。

当我们再次进行所有这些操作时3,'paper',我们发现没有catalog包含sid = 9and的行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并重新开始整个过程​​:

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

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



 类似资料:
  • Oracle 的 Java SE 的 JSSE 实现是包含了一个名为 SunJSSE 的供应商,通过 JCA 来预装和预注册。这个供应商提供以下加密服务: SSL 3.0 和 TLS 1.0 安全协议的实现 最常见 SSL 和 TLS 密码套件的实现,其中包括认证、密钥协议、加密和完整性保护 一个基于 x.509 的密钥管理器的实现,用于从标准的 JCA keystore 中选择合适的认证密钥 一

  • 问题内容: 我已经找到了尽可能多的文档和StackOverflow文章,但是使用Go 1.6中的新供应商功能无法导入。 这是我与Goji一起测试的示例项目。目录结构如下: 并且,项目中的唯一文件是这样的: 我的环境变量如下: 我尝试了最简单的构建命令,但是没有运气: 我也尝试用: …无济于事。我完全想念什么吗?任何建议表示赞赏。 问题答案: 我建议您阅读https://golang.org/doc

  • 问题内容: 我如何在Supplier这里用lambda表达式替换代码 上面这段代码的输出是: 问题答案: 如果您必须专门使用以下内容: 编辑:使用IntStream.generate,您可以将其执行为 注意:就API设计而言,更好的解决方案肯定是利用这种用例。

  • 以下代码 对于供应商get方法的定义 get方法应该返回T,但是构造函数没有返回类型,那么为什么String::New可以分配给供应商 呢?

  • 查询供应商列表 接口描述 获取所有供应商列表 URL /provider HTTP Method GET 请求参数 无 返回参数 返回参数 是否必须 类型 描述 providerId true String 供应商编号 providerName true String 供应商名称 HTTP请求示例 GET /provider HTTP/1.1 Host: api.miot.10046