如何在SQL中有条件地删除数字的所有条目

时间:2016-10-01 02:45:21

标签: sql

考虑以下架构: 供应商(sid:整数,sname:字符串,地址:字符串) ,Parts(pid:integer,pname:string,color:string) 和目录(sid:整数,pid:整数,成本:实数)

目录关系列出了供应商对零件收取的价格。

找到仅提供红色部件的供应商的sids。

所以我知道我最终需要为供应商选择目录sid,但我不知道如果他们销售的供应商sid的所有实例以及未着色为红色的商品,该如何删除。

会欣赏任何方向。我一直试图做AND的组合,但似乎无法消除所有出售非红色部分的sids。

1 个答案:

答案 0 :(得分:1)

仅销售红色部件的供应商:

Select distinct c.Sid
From Catalog c join Parts p 
   on p.pid = c.pid
Where p.Color = 'RED'
   and Not exists
        (Select * from Catalog 
         Where sid = c.Sid
            and pid in (Select Pid from Parts 
                        Where Color != 'RED'))

在英语中,它几乎与您在问题中所说的完全相同

“查找仅提供红色部件的供应商的sids。”

其中,将单词only转换为它的两部分......等同于

“查找提供红色部件且不提供任何非红色部件的供应商的sids。”

所以......

Select distinct c.Sid   -- "Find the sids  of suppliers ..."
From Catalog c join Parts p  
   on p.pid = c.pid
Where p.Color = 'RED'   -- "who supply red parts ... "
   and Not exists       -- " and do not supply ..." 
        (Select * from Catalog -- "  Parts ... "
         Where sid = c.Sid       
            and pid in (Select Pid from Parts  -- " ... That are ..."
                        Where Color != 'RED')) -- " ... Not Red"