Mysql SQL查询,其中所有A必须具有来自B的以下相等列?

Mysql SQL查询,其中所有A必须具有来自B的以下相等列?,mysql,sql,logic,subquery,relational-division,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查询来查找包

这里是我的具体例子,我的意思。我定义了下表:

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查询来查找包含与可卡犬颜色相同的宠物的品种?因此,如果数据库中的所有可卡犬都是黑色或白色的,我需要找到至少有一只黑色宠物和一只黄色宠物的所有不同品种。我已经被这个问题难住了一段时间,在网上找不到可比的答案,所以这里的任何帮助都将不胜感激。

如果我理解正确的话,你不会想要全白或全黑的品种。你只想要白色和黑色的品种——不同颜色的可卡犬。基于这一点,我得出了以下结论,尽管它可能不是最有效的

SELECT  DISTINCT breeds  FROM pets 
WHERE color in (SELECT color FROM pets where name='cocker spaniels')
DECLARE @pets TABLE(
  id INTEGER NOT NULL,
  name VARCHAR(20) NOT NULL,
  breed VARCHAR(20) NOT NULL,
  color VARCHAR(20) NOT NULL,
  weight INTEGER NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO @pets VALUES (1, 'jeff', 'breed1', 'black', 20)
INSERT INTO @pets VALUES (2, 'larry', 'breed1', 'white', 20)
INSERT INTO @pets VALUES (3, 'bob', 'breed2', 'black', 30)
INSERT INTO @pets VALUES (4, 'kevin', 'breed3', 'black', 30)
INSERT INTO @pets VALUES (5, 'jerry', 'breed3', 'white', 30)

DECLARE @breed VARCHAR(50)
SET @breed = 'breed1'
;WITH cte (color) AS (SELECT DISTINCT color FROM @pets WHERE breed = @breed)
SELECT breed, COUNT(id) FROM @pets WHERE color IN (SELECT color FROM cte)
  AND breed != @breed
GROUP BY breed
HAVING COUNT(id) >= (SELECT COUNT(*) FROM cte)

Result: breed3

如果您使用的SQL版本不支持CTE,那么可以使用temp表格或表格变量来保存您需要在其他品种中查找的颜色。希望这有帮助

一如既往,对实际的RDBMS保密会让事情变得更加困难

对于支持CTE PostgreSQL、Oracle、SQL Server的数据库。。 CTEs:

解释 以CTE颜色获得一组不同颜色的可卡犬。 加入所有颜色相同的宠物,按品种分组 在HAVING子句中,验证不同颜色的数量是否与可卡犬的颜色数量相匹配。 因此,包括可卡猎犬在内的宠物都有可卡猎犬所拥有的所有颜色,甚至可能更多

这是关系划分的一个特例。我们最近收集了大量的查询

对于MySQL
如何给出一些示例数据和输出示例?黄色是新的白色?哎呀,我忘了指定我使用的是MySQL,它不支持:/CTEs,我怎么做?@A_Obregon:我添加了MySQL的版本。
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);
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'
   );
--parameter
DECLARE @breed varchar(20)
SET @breed = 'Cocker Spaniel' 

--count distinct colors for param
DECLARE @colors int
SELECT @colors = COUNT(DISTINCT color) FROM pets WHERE breed = @breed 

--match param breed with others based on color
--return only breed with matching count of distinct colors
SELECT otherBreeds.breed
FROM
    (SELECT DISTINCT breed, color FROM pets WHERE breed = @breed) AS thisBreed
    LEFT OUTER JOIN (SELECT DISTINCT breed, color FROM pets WHERE breed <> @breed) AS otherBreeds
    ON thisBreed.color = otherBreeds.color
GROUP BY otherBreeds.breed
HAVING COUNT(DISTINCT otherBreeds.color) = @colors