使用嵌套查询提供某些特定部件的供应商的sids

时间:2017-03-16 16:42:18

标签: sql

架构:

  

供应商(sid:整数,sname:字符串,地址:字符串)

     

部件(pid:整数,pname:字符串,颜色:字符串)

     

_Catalog(sid:integer,pid:integer,cost:real)

问题是:

  

找出供应红色部分或位于221的供应商的sids   Packer Ave。

我尝试过不同的方法,如:

  

方法1:

select sid 
from   Suppliers 
where  sid = (select pid 
              from parts 
              where color= 'Red') 
or     address='221 Packer Ave';
  

方法2:

select sid 
from   _Catalog 
where  (pid IN(select pid from Parts where color='Red') 
        OR 
        sid IN(select sid from Suppliers where address='221 Packer Ave'));

它在第二种方法中没有显示输出,并在第一种方法Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.中返回错误 我究竟做错了什么?还有其他解决办法吗?

注意:我需要一个嵌套查询来解决这个问题,因为我还没有研究过连接和提升内容。

5 个答案:

答案 0 :(得分:1)

刚想通了:))

select sid from Suppliers where address='221 Packer Ave' or sid IN (select sid from _Catalog where pid IN(select pid from Parts where color = 'Red'));

答案 1 :(得分:0)

如果您可以管理多个值,则可以使用IN子句

select sid 
from   Suppliers 
where  sid IN   (select sid
              from parts  p 
              inner join _Catalog c c.pid= p.pid
              where p.color= 'Red') 
or     address='221 Packer Ave';

你可以使用聚合函数,例如:max

select sid 
from   Suppliers 
where  sid = (select max(sid)
              from parts  p 
              inner join _Catalog c c.pid= p.pid
              where p.color= 'Red') 
or     address='221 Packer Ave';

或者您可以限制所选的数量或行数,例如:TOP 1

答案 2 :(得分:0)

这是因为:

pid

会返回多个=,并且您在适用的情况下使用select top (1) pid from parts where color= 'Red'

使用IN或将返回的pid限制为一行。

Playall()

答案 3 :(得分:0)

解决问题的最佳方法是使用JOIN而不是派生查询。 这是一个例子:

SELECT DISTINCT
    sup.sid
FROM
    Suppliers AS sup
    LEFT OUTER JOIN _Catalog cat ON sup.sid = cat.sid
    INNER JOIN Parts par ON cat.pid = par.pid
WHERE
    sup.address = '221 Packer Ave'
    OR cat.color = 'Red'

您似乎缺少的是确定零件供应商需要来自所有三个表的数据:零件具有颜色,目录具有供应商和零件之间的关系,最后供应商具有SID

另一个解决方案是CTE,它有时可能表现更好(由于不同的查询计划,尤其是不需要DISTINCT的事实),但仅适用于SQL Server 2008R2 +:

;WITH CTE_RedPartSuppliers AS (
    SELECT
        cat.sid
    FROM
        Parts par
        INNER JOIN _Catalog cat ON par.pid = cat.pid
    WHERE
        par.color = 'Red'
)

SELECT
    sup.sid
FROM
    Suppliers sup
WHERE
    address = '221 Packer Ave'
    OR EXISTS (
        SELECT 1 FROM CTE_RedPartSuppliers rps WHERE rps.sid = sup.sid
    )

答案 4 :(得分:0)

好奇为什么你不能进行内部联接?

select parts.sid 
from   Suppliers Suppliers inner join parts parts
where  
parts.color = 'Red' 
or     
parts.address = '221 Packer Ave'