2017-03-16 64 views
1

架构一些particualr部分:SIDS谁提供使用嵌套查询

供应商(SID:整数,SNAME:字符串,地址:字符串)

零部件(PID:整数,PNAME:字符串,颜色:字符串)

_Catalog(SID:整数,PID:整数,成本:真正的)

,问题是:

查找供应商的红色部分供应商的位置,或者位于Packer大道221 。

我已经尝试了不同的方法,如:

方法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. 我在做什么错?还有其他解决方案吗?

注:我需要一个嵌套查询来解决这个问题,因为我还没有研究过连接和推进的东西。

+0

如果你正在使用的sqlserver ..为什么标签mysql的??????? – scaisEdge

+0

@scaisEdge感谢您纠正我:) – Weaboo

回答

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')); 
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'; 

你可以使用一个聚合的功能,例如:最大

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

+1

答案是错误的,其中sid IN(SELECT pid ...)无效,供应商ID和产品ID无关... –

+0

@PhilP。谢谢...回答更新与关系 – scaisEdge

0

这是因为:

select pid 
from parts 
where color= 'Red' 

返回多个pid,并且您在使用where条件时使用=

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

select top (1) pid 
from parts 
where color= 'Red' 
+0

可能有超过1个供应商。 – Weaboo

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 2008 R2 +:

;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 
    ) 
0

好奇,为什么你不能只是做一个内部连接?

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

我只是一个初学者,还没有研究过加入:') – Weaboo