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

标签 sql relational-division

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

你有三个表:

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

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

(因此,如果供应商 1 的库存中有香蕉和苹果,您需要找到所有至少携带香蕉和苹果的供应商)

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

显然这是一个已知问题/问题,您应该检查这个问题: How to filter SQL results in a has-many-through relation (优秀的解决方案和分析)

最佳答案

这个问题被称为 relational division .

一个解决方案是双重否定。您可以选择所有供应商,对于这些供应商,不存在供应商 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
                )
        )

Live example at SQL Fiddle.

关于sql - 棘手的 sql 查询 - 寻找替代供应商(关系部门),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14318572/

相关文章:

MySQL - 如果在另一个表上匹配,则排除一个表中的所有行

mysql - 无法导入大型 mysql 转储

mysql - 如何将 max 和 min 的输出加在一起以获得总和

mysql - 关系划分

sql - Postgres 中的记录交集

mysql - 我想显示学生ID,谁拥有以上5个单元?

sql - 在 Oracle 中返回正则表达式的所有匹配项

sql - SELECT MAX() 太慢 - 有其他选择吗?

sql - 仅使用具有 `in` 子句中所有值的列连接查询

mysql - IN 对于许多元素