找到供应红色部分和绿色部分的供应商的

时间:2019-07-09 19:26:31

标签: sql db2

我对一些sql有疑问。

非常感谢您的帮助。

我试图将两个表连接起来,但是我不知道如何获取所需的输出。

Select SID, COLOR from cat c1 JOIN par p ON c1.PID = p.PID;

SID  COLOR     
---  ---------

S1  red       
S1  silver    
S1  red       
S2  red       
S2  red       
S2  red       
S3  red       
S3  green     
S4  trans     
S4  cyan      
S4  magenta

这是我需要的输出:

SID    COLOR1       COLOR2     
-----  ----------  ---------- 
S3     green        red

这是提供的表格:

SELECT * FROM parts 



PID    PNAME      COLOR        WEIGHT CITY       
-----  ----------  ----------  ------ ----------

P1    Nut        red            13 London     
P2    Bolt       black          18 Paris      
P3    Screw      red            17 Rome       
P4    Screw      silver         14 London     
P5    Cam        trans          12 Paris      
P6    Cog        cyan           19 London     
P7    Nut        magenta        15 -          
P8    Wheel      red            15 Munich     
P9    Bearing    green          15 Milano     

  9 record(s) selected. 




SELECT * FROM catalog 

SID   PID   COST         
-----  -----  ------------ 

S1    P3            0.50 
S1    P4            0.50 
S1    P8           11.70 
S2    P1           16.50 
S2    P3            0.55 
S2    P8            7.95 
S3    P8           12.50 
S3    P9            1.00 
S4    P5            2.20 
S4    P6      1247548.23 
S4    P7      1247548.23 

  11 record(s) selected.

1 个答案:

答案 0 :(得分:1)

您必须group by cat.sid并将条件放在HAVING子句中:

select 
  c.sid, 
  min(p.color) color1 ,
  max(p.color) color2
from cat c inner join par p 
on c.pid = p.pid
where p.color in ('green', 'red')
group by c.sid
having count(distinct p.color) = 2

仅选择两种颜色的零件后,只有供应商提供一种或两种颜色。
条件having count(distinct p.color) = 2仅返回同时提供两种颜色的供应商。
min()max()返回2种颜色。在这种情况下,实际上并不需要它们,但我更喜欢使用它们,而不是对其进行硬编码。