SQL - 选择所有穿着两种不同衬衫颜色的球队?

时间:2013-10-05 09:40:27

标签: sql

我有这张桌子:

播放(日期,时间,位置,名称,TeamName,ShirtColor)

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

由于我没有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)

3 个答案:

答案 0 :(得分: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语句中使用。

答案 1 :(得分:1)

您不需要子查询:

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

答案 2 :(得分:1)

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

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

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

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