我只是想问一下是否有人可以帮我理解这个查询实际上做了什么?
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 ) ) ;
答案 0 :(得分:3)
not exists ( select ... )
为true
,当select不返回任何行时。
所以最里面的select
试图找到有库存的产品。哪些产品?中间select
选择的任何一个,它反过来反转最里面的查询(即它返回所有产品没有股票)。所有已知仓库都会加入,以获得库存清单,这些仓库中没有来自该供应商的任何产品。
当您使用正逻辑时,理解起来会变得更加简单:
首先,我们创建三组:
D
)P
中的所有产品库存以及D
中的仓库(设置S
)请注意,还有另一套supplier S
,但这不是我所说的。
现在我们过滤这些集合。
首先,我们删除所有有库存的产品(内部not exists
)。这给了我们一套没有库存的产品。
在最后一步中,我们从结果中删除所有仓库,此集合不为空。
答案 1 :(得分:1)
您实际上是在尝试查找“Azure Supplies”制作的所有产品,而这些产品并不存在于该库存中。
答案 2 :(得分:0)
本质上是从表仓库中选择一个位置和地址,其中没有名为“Azure Supplies”的供应商,也没有与该供应商相关的产品。
答案 3 :(得分:0)
从仓库D中选择位置和地址,其中没有名称供应商" azure供应"这在库存中也不存在。
all =条件只是为了显示公共列值b / w表。