给出一个有不同颜色的产品表,
NAME COLOR
---- -----
pen red
pen blue
pen yellow
box red
mic red
tape blue
如何找到red
和blue
(pen
)中可用产品的名称,以及red
中可用产品的名称,但是不在blue
(box
,mic
)?
答案 0 :(得分:2)
对于这些类型的查询,我喜欢group by
having
。
两种颜色:
select name
from t
group by name
having sum(case when color = 'red' then 1 else 0 end) > 0 and
sum(case when color = 'blue' then 1 else 0 end) > 0;
红色但不是蓝色:
select name
from t
group by name
having sum(case when color = 'red' then 1 else 0 end) > 0 and
sum(case when color = 'blue' then 1 else 0 end) = 0;
having
子句中的条件计算与条件匹配的行数(对于每个name
)。因此,> 0
表示至少有一行匹配,= 0
表示没有匹配的行。