SIDS谁提供使用嵌套查询
架构一些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.
我在做什么错?还有其他解决方案吗?
注:我需要一个嵌套查询来解决这个问题,因为我还没有研究过连接和推进的东西。
就想通了:)
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'));
如果你能够比的值越多,你可以使用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
答案是错误的,其中sid IN(SELECT pid ...)无效,供应商ID和产品ID无关... –
@PhilP。谢谢...回答更新与关系 – scaisEdge
这是因为:
select pid
from parts
where color= 'Red'
返回多个pid
,并且您在使用where条件时使用=
。
使用IN或将返回的pid限制为一行。
select top (1) pid
from parts
where color= 'Red'
可能有超过1个供应商。 – Weaboo
解决此问题的最佳方法是使用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
)
好奇,为什么你不能只是做一个内部连接?
select parts.sid
from Suppliers Suppliers inner join parts parts
where
parts.color = 'Red'
or
parts.address = '221 Packer Ave'
我只是一个初学者,还没有研究过加入:') – Weaboo
如果你正在使用的sqlserver ..为什么标签mysql的??????? – scaisEdge
@scaisEdge感谢您纠正我:) – Weaboo