我有以下关系
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。
我使用查询但返回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'
)
我想问一下上面和下面的查询有什么区别? (它也返回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'
)
答案 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';
答案 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