2014-06-09 37 views
0

我不知道我是否过于复杂的事情或什么,但我的SQL代码给出错误。我试图找到所有匹配表格部件的'pid'。嵌套SQL语句出错。三个表选择

以下是必要的信息。

表:Parts

pid, Color 

表:Supplier

sid 

表:Catalog

pid, sid 

我试图检索具有颜色红色和供应商即pid存在于01表Supplier的。

这是我迄今为止尝试:

SELECT pid 
FROM catalog 
WHERE sid = (SELECT sid 
      FROM 'suppliers' 
      WHERE sid=)(SELECT sid 
         FROM `catalog` 
         WHERE pid=)(SELECT pid 
            FROM `parts` 
            WHERE color = 'Red') 

我的第二尝试说错误,子查询返回多个1行:

SELECT pid FROM catalog c where c.pid=(SELECT pid from parts p where p.color='Red') AND c.sid=(SELECT sid FROM suppliers s) 
+0

一种奇怪的方式来做到这一点,但如果您从表名(在FROMs后面)拉出单引号,仍然可能工作。某种JOIN解决方案在这里是标准的。 – VBlades

回答

2

为什么不使用两个简单的INNER JOIN而不是那些嵌套的子查询?

SELECT c.pid 
FROM catalog c 
INNER JOIN suppliers s ON c.sid = s.sid 
INNER JOIN parts p ON c.pid = p.pid 
WHERE p.color = 'Red' 
+0

有没有办法只用AND做这个? – user2997307

+0

@ user2997307:使用'INNER JOIN'是最简单也是最有效的方法。 –

0

我想你可能会乱放开放paranthesis。但我建议使用JOIN查询。

SELECT pid 
FROM Catalog C 
INNER JOIN suppliers S ON C.sid = S.sid 
INNER JOIN parts P ON C.pid = P.pid 
WHERE P.color = 'Red' 
AND S.sid = 'your_requirement' 
+0

如果您提到'JOIN',为什么不使用'JOIN'?您的语法已过时,不应使用,因为它可能会导致错误。因此,请尝试'从目录c选择c.pid加入供应商在c.sid = s.sid在c.pid = p.pid上加入部分p其中p.color ='红色' – alzaimar

+0

@alzaimar对不起。这是我真正做到的。我会改变它。谢谢。 – ncdreamy

+0

伙计们,有没有办法只是用AND做这个? – user2997307

0

您应该避免@ncdreamy建议的内部查询,并使用JOINS代替。

SELECT pid 
FROM catalog AS c 
INNER JOIN Parts AS p ON p.pid = c.pid 
INNER JOIN suppliers AS s on s.sid = c.sid 
WHERE p.color = 'RED'