这个SQL查询实际上做了什么?

时间:2013-01-23 16:44:57

标签: mysql sql

我只是想问一下是否有人可以帮我理解这个查询实际上做了什么?

select location, address
from warehouse D 
where not exists
    ( select * from product P, supplier S
      where P.supplier_no = S.supplier_no
      and   S.name = 'Azure Supplies'
      and   not exists
            ( select *
              from stock S
              where P.product_no = S.product_no
              and D.warehouse_no = S.warehouse_no ) ) ;

4 个答案:

答案 0 :(得分:3)

not exists ( select ... )true,当select不返回任何行时。

所以最里面的select试图找到有库存的产品。哪些产品?中间select选择的任何一个,它反过来反转最里面的查询(即它返回所有产品没有股票)。所有已知仓库都会加入,以获得库存清单,这些仓库中没有来自该供应商的任何产品。

当您使用正逻辑时,理解起来会变得更加简单:

首先,我们创建三组:

  • 所有仓库(设置D
  • 所有产品均来自“Azure Supplies”(设置为“P”)
  • P中的所有产品库存以及D中的仓库(设置S

请注意,还有另一套supplier S,但这不是我所说的。

现在我们过滤这些集合。

首先,我们删除所有有库存的产品(内部not exists)。这给了我们一套没有库存的产品。

在最后一步中,我们从结果中删除所有仓库,此集合不为空。

答案 1 :(得分:1)

您实际上是在尝试查找“Azure Supplies”制作的所有产品,而这些产品并不存在于该库存中。

答案 2 :(得分:0)

本质上是从表仓库中选择一个位置和地址,其中没有名为“Azure Supplies”的供应商,也没有与该供应商相关的产品。

答案 3 :(得分:0)

从仓库D中选择位置和地址,其中没有名称供应商" azure供应"这在库存中也不存在。

all =条件只是为了显示公共列值b / w表。