我有这张桌子:
播放(日期,时间,位置,名称,TeamName,ShirtColor)
我想选择所有穿着两种不同衬衫颜色的球队。
由于我没有SQL DB,我想问这两个中的哪一个(或者可能都没有)是正确的,为什么?
SELECT (DISTINCT TeamName)
FROM Playing
WHERE TeamName IN (SELECT TeamName FROM Playing GROUP BY TeamName HAVING COUNT(DISTINCT ShirtColor) = 2)
SELECT (DISTINCT TeamName)
FROM Playing
WHERE TeamName IN (SELECT TeamName FROM Playing WHERE COUNT(DISTINCT ShirtColor) = 2 GROUP BY ShirtColor)
答案 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