SQL - 逻辑背后​​存在,并且不存在于多个从属子查询中

时间:2017-02-09 17:43:28

标签: sql

假设我们有以下三种关系:

  • 供应商(Sid,sname)
  • 部分(Pid,pname)
  • 目录(Sid,Pid)

目录表中的Sid和Pid是引用供应商和零件的外键。记录(s1,p1)表示供应商s1已生成零件p1。

我想在下面的四种情况下解释下面查询的逻辑:

SELECT * 
FROM parts P
WHERE ---(A)--- (SELECT S.Sid 
                FROM suppliers S
                WHERE ---(B)--- (SELECT * 
                                FROM catalog C 
                                WHERE S.Sid=C.Sid AND P.Pid=C.Pid))

现在我们(A)和(B)的案例是:

  1. (A):NOT EXISTS
    (B):EXISTS

  2. (A):EXISTS
    (B):EXISTS

  3. (A):EXISTS
    (B):NOT EXISTS

  4. (A):NOT EXISTS
    (B):NOT EXISTS
  5. 假设以下示例表: sample tables

    非常感谢

    以下是给定样本表上每个案例的结果:

    案例1 - >没有供应商生产的零件(40)
    案例2 - >至少由供应商之一(10,20,30)生产的零件 案例3 - >某些供应商没有生产的零件(20,30,40?)
    case4 - >由所有供应商生产的零件(10)

    请解释如何获取它们并逐步解释逻辑

1 个答案:

答案 0 :(得分:0)

在提到的场景中,三个查询彼此是dependent

Case 1:如果Lower query返回一些结果,那么它允许中间查询执行,类似地,如果middle query没有返回任何结果,则执行upper query

Case 2:如果Lower query返回某些结果,则会让中间查询执行,如果middle query返回任何结果,则会upper query执行。

Case 3:如果Lower query没有返回任何结果,那么它会让中间查询执行,如果middle query返回一些结果,它会让upper query获得执行。

Case 4:如果Lower query没有返回任何结果,那么它允许中间查询执行,如果middle query也没有返回任何结果,则允许upper query被执行。

Explaining Case 1SELECT * FROM catalog C WHERE S.Sid=C.Sid AND P.Pid=C.Pid返回所有三个表的连接

示例:
1 ali 10 A
1 ali 30 C


如果通过此连接条件获取某些记录,则middle query
SELECT S.Sid                 FROM供应商S被执行它取出供应商表格中的所有sid。
从现在起middle query也提供了一些结果,因此upper query不会被执行,因此数据将从整个查询中获取。