0

我有这张桌子:

播放(日期,时间,位置,名称,团队名称,衬衫颜色)

我想选择所有穿着两种不同颜色球衣的球队。

由于我没有 SQL DB,我想问一下这两个(或者可能都不是)中的哪一个是正确的,为什么?

  1. SELECT (DISTINCT TeamName)
    FROM Playing
    WHERE TeamName IN (SELECT TeamName FROM Playing GROUP BY TeamName HAVING COUNT(DISTINCT ShirtColor) = 2)

  2. SELECT (DISTINCT TeamName)
    FROM Playing
    WHERE TeamName IN (SELECT TeamName FROM Playing WHERE COUNT(DISTINCT ShirtColor) = 2 GROUP BY ShirtColor)

4

3 回答 3

2

不幸的是,从句法的角度来看,您的任何查询都不正确。

这是一个带有示例数据的SQLFiddle,以及您正在寻找的查询

SELECT TeamName 
FROM Playing 
GROUP BY TeamName 
HAVING COUNT(DISTINCT ShirtColor) = 2

当您对记录进行 GROUP 时,需要在HAVING语句中使用聚合函数(COUNT、SUM、AVG 等)的条件。

您的第一个查询是正确的,如果您从 中删除括号(DISTINCT TeamName),尽管正如ypercube 所提到的,它有点过于复杂,但在功能上是正确的。

而您的第二个查询将不起作用,因为

SELECT TeamName FROM Playing WHERE COUNT(DISTINCT ShirtColor) = 2部分不正确。正如我之前提到的,您对聚合函数的条件(在您的情况下COUNT)必须在HAVING语句中使用。

于 2013-10-05T09:56:06.337 回答
1

您不需要子查询:

SELECT TeamName 
FROM Playing 
GROUP BY TeamName 
HAVING COUNT(DISTINCT ShirtColor) = 2
于 2013-10-05T09:55:01.123 回答
1

当您尝试使用聚合来过滤数据时,您应该使用HAVING子句。该WHERE子句将引发错误。

所以在你的情况下,No2 是不正确的。

No1 有一个subquery返回所有具有两种不同颜色的团队。那部分是正确的。但是你有一个没有意义的选择。你可以只使用:

SELECT TeamName FROM Playing GROUP BY TeamName HAVING COUNT(DISTINCT ShirtColor) = 2
于 2013-10-05T09:56:12.473 回答