2017-03-16 33 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