0

我只是想问是否有人可以帮助我理解这个查询的实际作用?

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

4 回答 4

3

not exists ( select ... )is true, when the select doesn't return any rows.

因此,最内层select试图找到有库存的产品。哪些产品?任何由中间选择的,select这反过来又反转最里面的查询(即它返回所有没有库存的产品)。这将连接所有已知的仓库,以获取库存中没有该供应商的任何产品的仓库列表。

当你使用正逻辑时,它变得更容易理解:

首先,我们创建三个集合:

  • 所有仓库(套D
  • “Azure Supplies”的所有产品(设置`P)
  • (套)P仓库进出的所有产品库存DS

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

现在我们过滤这些集合。

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

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

于 2013-01-23T17:06:31.860 回答
1

您实际上是在尝试查找库存中不存在的所有由“Azure Supplies”制造的产品。

于 2013-01-23T16:49:50.897 回答
0

它从仓库 D 中选择位置和地址,那里没有名称为“azure supply”的供应商,库存 s 中也不存在。

all = 条件只是为了显示常见的列值 b/w 表。

于 2013-01-23T16:54:20.227 回答
0

这实质上是从没有名为“Azure Supplies”的供应商且没有与该供应商相关的产品的表仓库中选择位置和地址。

于 2013-01-23T16:48:18.507 回答