我有3个不同的表,其中包含:
suppliers (sid; sname; adress)
parts(pid; pname; color)
catalog (sid; pid; cost)
现在我必须获取供应商的SID,这些供应商提供红色部分和绿色部分。
结果应为以下内容:
SID Color1 Color2
--- --------- ------
S1 green red
我不知道要选择相同属性Color
的2个值,我该怎么做。我必须使用子查询吗?
答案 0 :(得分:0)
您可以使用聚合和having
子句:
select s.sid
from suppliers s join
catalog c
on s.sid = c.sid join
products p
on c.pid = p.id
where p.color in ('green', 'red')
group by s.id
having count(distinct p.color) = 2;
答案 1 :(得分:0)
要获得两个列,您必须两次连接products表。尽管这行得通,但它并不能缩放(假设您必须扩展到10种不同的颜色...)。
因此,戈登·利诺夫(Gordon Linoff)的上述答案有效,并将在单独的行中以相同的sid
返回每种颜色,如下所示:
SID Color
--- -----
S1 red
S1 green
在两个专栏中获得它(如果您真的想这样做):
SELECT s.sid, p1.color, p2.color
FROM suppliers s
JOIN cataglog c ON c.sid=s.sid
JOIN products p1 ON p1.pid=c.pid
LEFT JOIN products p2 ON p2.pid=c.pid AND p2.color != p1.color
GROUP BY s.sid
在没有第二种颜色的情况下,左联接第二个产品表。
同样,这很丑陋且无法扩展,我建议采用多行解决方案。