0

我有以下关系

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'
    )
    
4

5 回答 5

3

在您的第一个查询中:

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

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

于 2013-05-08T20:04:48.180 回答
2

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

在您的第二个查询中,您将两次加入 Parts 表和 Catalog 表,因此您现在尝试在 Catalog 中找到一个红色的 Part,该 Part 也有另一个 Catalog 的 Part 是绿色的。这可能就是你想要的。

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

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

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

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

于 2013-05-08T20:10:05.780 回答
1

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

尝试一次删除一个“和”选择标准,直到您在答案集中得到一些东西,然后努力确定为什么单个选择标准(您在它开始工作之前删除的那个)不匹配并相应地更改它.

希望这可以帮助!

于 2013-05-08T20:05:14.517 回答
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

于 2013-05-08T20:09:46.707 回答
1

您想找到可以购买红色零件和绿色零件的供应商。这些供应商备有两种颜色。

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

在下文中,我们将提供红色零件的供应商的 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
于 2013-05-08T21:07:47.790 回答