mysql - SQL 查询,其中所有 A 的 B 中的以下列都必须相等?

标签 mysql sql logic subquery relational-division

这是我的具体示例。我定义了下表:

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);

解释

  1. 获取 CTE color 中可卡犬不同颜色的集合。
  2. 加入所有颜色相同的宠物,按品种对宠物进行分组
  3. 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'
   );

-> sqlfiddle

关于mysql - SQL 查询,其中所有 A 的 B 中的以下列都必须相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12925646/

相关文章:

algorithm - 欧拉计划 #22 - 逻辑不正确?

mysql - 我想将表从 SQL Server 导出到 mysql

mysql - 为什么我在尝试创建新表 mysql 时会出现此错误?

php - Google Map API v3 - (1) map 暂时闪烁错误的地理编码 (2) 添加标记点击事件

sql - 查找特定组中的最低值

mysql - 按日期检索每组中的最后一条记录 - MySQL

c++ - 在 MacOS Catalina 上使用 CMake 编译/链接 mysql-connector-c++

sql - Rails PG::UndefinedTable:错误:缺少表的 FROM 子句条目

c - 冒泡排序示例

c# - 如何过滤掉国家代码?