繁体   English   中英

SQL查询,仅从另一个表中选择具有互斥的一组相关实体的结果

[英]SQL query to select only results having an exclusive set of related entities from another table

我有一个带有2个表的关系数据库,比方说paintingscolors 它们通过数据透视表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 INNOT 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM