这是我的具体示例。我定义了下表:
CREATE TABLE pets (
id INTEGER UNSIGNED NOT NULL,
name VARCHAR(20) NOT NULL,
breed VARCHAR(20) NOT NULL,
color VARCHAR(20) NOT NULL,
weight INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (id)
);
我如何编写 SQL 查询来查找包含与可卡犬颜色所有相同颜色的宠物的品种?因此,如果数据库中的所有可卡犬都是黑色或白色,我需要找到至少有 1 只黑色宠物和 1 只黄色宠物的所有不同品种。我已经被这个问题困扰了一段时间,并且无法在网上找到类似的答案,因此我们将不胜感激。
最佳答案
与往常一样,对实际的 RDBMS 保密会让事情变得更加困难。
对于支持 CTE 的数据库(PostgreSQL、Oracle、SQL Server ..)
CTE:
WITH colors AS (
SELECT DISTINCT color
FROM pets
WHERE breed = 'cocker spaniels'
)
SELECT p.breed
FROM colors c
JOIN pets p USING (color)
GROUP BY p.breed
HAVING count(DISTINCT p.color) = (SELECT count(*) FROM color);
解释
- 获取 CTE
color
中可卡犬不同颜色的集合。 - 加入所有颜色相同的宠物,按品种对宠物进行分组
- 在
HAVING
子句中,验证不同颜色的数量是否与可卡犬的颜色数量相匹配。
因此:由此产生的宠物(包括可卡犬)具有可卡犬的所有颜色 - 甚至可能更多。
这是关系划分的一个特例。我们在this related question下收集了一整套查询。最近。
<小时/>对于 MySQL
SELECT p.breed
FROM (
SELECT DISTINCT color
FROM pets
WHERE breed = 'cocker spaniels'
) c
JOIN pets p USING (color)
GROUP BY p.breed
HAVING count(DISTINCT p.color) = (
SELECT count(DISTINCT color)
FROM pets
WHERE breed = 'cocker spaniels'
);
关于mysql - SQL 查询,其中所有 A 的 B 中的以下列都必须相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12925646/