[英]SQL query to select only results having an exclusive set of related entities from another table
我有一个带有2个表的关系数据库,比方说paintings
和colors
。 它们通过数据透视表color_painting
多对多关系。
“绘画”表:
id name
---------------------
1 Lion and cubs
2 Sunset in Ontario
“颜色”表:
id color
---------------------
1 grey
2 yellow
3 orange
“ color_painting”表:
painting_id color_id
---------------------
1 1
1 2
2 1
2 2
2 3
因此,绘画与颜色链接如下:
“ Lion and cubs
”与颜色“ grey
”和“ yellow
”相关
“ Sunset in Ontario
”与“ grey
”,“ yellow
”和“ orange
”相关联
如何编写一个SQL查询来选择仅包含特定颜色的绘画而没有其他颜色的绘画?
例如,我想要只带有“灰色”和“黄色”的画。 因此,查询应返回“狮子和小熊”绘画,但不返回“日落”,因为“日落”也具有“橙色”。
是否可以处理一个查询? (SQL应该在MySQL,SQLite,PostgreSQL和SQL Server方言上运行)。
使用NOT IN
或NOT EXISTS
排除不同颜色的绘画,其余绘画必须有两行才能满足您的需求。
select p.id, p.name
from paintings p
join color_painting cp on p.id = cp.painting_id
where p.id not in
(
select painting_id
from color_painting cp
join colors c on cp.color_id = c.id and c.color not in ('yellow','grey')
)
group by p.id, p.name
having count(*) = 2
要检查是否使用了所有需要的颜色,请计算使用了多少种颜色:
SELECT *
FROM paintings
WHERE (SELECT COUNT(*)
FROM color_painting
WHERE painting_id = paintings.id
AND color_id IN (1, 2)
) = 2
AND NOT EXISTS (SELECT *
FROM color_painting
WHERE painting_id = paintings.id
AND color_id NOT IN (1, 2));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.