如何在SQL中选择2个相同属性的值

时间:2019-07-09 13:15:21

标签: sql relational-division

我有3个不同的表,其中包含:

suppliers (sid; sname; adress)
parts(pid; pname; color)
catalog (sid; pid; cost)

现在我必须获取供应商的SID,这些供应商提供红色部分和绿色部分。

结果应为以下内容:

SID      Color1      Color2
---      ---------   ------
S1       green       red

我不知道要选择相同属性Color的2个值,我该怎么做。我必须使用子查询吗?

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

在没有第二种颜色的情况下,左联接第二个产品表。

同样,这很丑陋且无法扩展,我建议采用多行解决方案。