查询返回null并且找不到错误

时间:2013-05-08 20:00:57

标签: mysql sql

我有以下关系

Supplies            
sid     1       2       3       4
sname   Jason   David   John    Peter
address 1a      2b      3c      4d


Parts                       
pid     10      20      30      40
pname   Head    Body    Hand    Leg
color   red     blue    green   white


Catalog             
sid 1   1   2   2   3   4   1
pid 10  20  20  30  30  40  30
cost100 200 150 150 130 125 50

我希望找到提供红色和绿色部分的耗材ID。

  1. 我使用查询但返回null,我不知道为什么? (它应该返回sid是1)

    SELECT S.sid
    FROM Suppliers AS S, Parts AS P, Catalog AS C
    WHERE S.sid = C.sid
    AND C.pid = P.pid
    AND (
    P.color =  'red'
    AND P.color =  'green'
    )
    
  2. 我想问一下上面和下面的查询有什么区别? (它也返回null但我认为它应该返回sid是1)

    SELECT S.sid
    FROM Suppliers AS S, Parts AS P1, Catalog AS C1, Parts AS P2 , Catalog AS C2
    WHERE S.sid = C1.sid
    AND C1.pid = P1.pid
    AND S.sid = C2.pid
    AND C2.pid = P2.pid
    AND (
    P1.color =  'red'
    AND P2.color =  'green'
    )
    

5 个答案:

答案 0 :(得分:3)

在您的第一个查询中:

P.color不能同时等同于red **AND** green

第二个查询错误,因为有两个表使用不同的别名连接两次。

答案 1 :(得分:2)

在您的第一个查询中,您尝试查找任何红色和绿色的零件。不存在这样的行。

在第二个查询中,您将加入“零件”表和“目录”表两次,以便您现在尝试在目录中找到一个红色的零件,该零件还具有另一个带有绿色零件的目录。这可能就是你想要的。

但是,你的WHERE语句中有一个小错误

WHERE S.sid = C1.sid
AND S.sid = C2.pid  <-- error is here, it should be C2.sid

有一种更简洁的方式来编写此查询。它不是更快,但更容易阅读。请注意,我已将表Catalog重命名为cata,因为sqlfiddle不喜欢单词目录。

select s.sid 
  from suppliers s
  join cata cr on s.sid = cr.sid
  join parts pr on pr.pid = cr.pid and pr.color = 'red'
  join cata cg on s.sid = cg.sid
  join parts pg on pg.pid = cg.pid and pg.color = 'green';

sqlfiddle

答案 2 :(得分:1)

可能找不到任何匹配,因此返回空答案集或“null”

尝试一次删除一个“和”的选择标准,直到你在答案集中得到一些内容,然后确定为什么单个选择标准(你在它开始工作之前删除的那个)没有匹配的原因相应地改变它。

希望这有帮助!

答案 3 :(得分:1)

1.完全同意 sdespont 。因此,请将您的第一个Query修改为类似

的内容

SELECT S.sid
FROM Suppliers AS S
inner join Catalog AS C on C.SID=S.SID
inner join Parts AS P on P.PID=C.PID
WHERE
P.color =  'red'
AND
P.color =  'green'

2.第二个Query也有与第一个相同的相同问题。此外,您无需加入相同twice

答案 4 :(得分:1)

您想找到供应商,您可以从中购买红色零件以及绿色零件。这些供应商都有两种颜色。

当您cannot find error时,编写查询以便明确划分子集(如维恩图)会很有帮助。这可以使用内联视图完成。语法可能看起来不那么简洁,但简洁的语法与性能无关;内联视图可以很好地执行,特别是如果您使用id列表并且不会引入任何无关的数据。

在下文中,我们将提供红色部件的供应商的ID列表与提供绿色部件的供应商的ID列表相互关联,然后当我们想要获取所有供应商数据时再将其与供应商表格相交。可能需要(姓名,电话号码,地址,传真号码,销售代表名称等)。

      select * from suppliers

           join

           (



            select redsuppliers.sid   
             from

           (
            select sid 
            from catalog join parts
            on catalog.pid = parts.pid
            where parts.color = 'red'
            ) redsuppliers

            join


           (
            select sid 
            from catalog join parts
            on catalog.pid = parts.pid
            where parts.color = 'green'
            ) greensuppliers
           on redsuppliers.sid=greensuppliers.sid



           ) as SuppliersWithBothColors

          on suppliers.sid = SuppliersWithBothColors.sid