棘手的SQL查询 - 寻找替代供应商(关系部门)

str*_*rum 3 sql relational-division

这是我从一本书中得到的一个问题(不记得哪一本),它是这样的:

你有三个表:

  • 供应商(supId, name)
  • 产品(prodId, name)
  • 库存(supId, prodId)

您需要通过一个查询找到供应商X所拥有的所有产品(或更多)的所有供应商(假设供应商X是其中的那个supId=1).

(如果供应商1在他的库存中有香蕉和苹果,你需要找到所有至少带有香蕉和苹果的供应商)

您只能使用标准SQL(包括连接).

显然这是一个已知的问题/问题,你应该看看这个问题: 如何过滤多次通过关系的SQL结果 (优秀的解决方案和分析)

And*_*mar 6

这个问题被称为关系分裂.

一种解决方案是双重否定.您可以选择供应商X未交付产品的所有供应商,这些供应商不是由他们提供的:

select  distinct other_supplier.SupID
from    Inventory other_supplier
where   not exists
        (
        select  *
        from    Inventory supplier_X
        where   supplier_X.supId = 1 -- For supplier X
                and not exists
                (        
                select  *
                from    Inventory other_product
                where   other_supplier.supId = other_product.Supid
                        and supplier_X.prodId = other_product.prodId
                )
        )
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle的实例.