架构:
供应商(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.
中返回错误
我究竟做错了什么?还有其他解决办法吗?
注意:我需要一个嵌套查询来解决这个问题,因为我还没有研究过连接和提升内容。
答案 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'