2013-10-05 40 views
0

我有這個表: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)

回答

2

不幸的是,沒有你查詢的是從一個語法點正確。

這裏是一個SQLFiddle樣本數據,並與查詢您正在尋找

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

當組記錄,爲您的聚合函數(COUNT,SUM,AVG等)的條件需要在HAVING聲明中使用。

第一查詢是正確的,如果你從(DISTINCT TeamName)消除括號,雖然作爲ypercube提到的,實在是有點過於複雜,但功能上是正確的。

而你第二查詢將無法​​工作,因爲

SELECT TeamName FROM Playing WHERE COUNT(DISTINCT ShirtColor) = 2部分是不正確的。正如我前面提到的那樣,您的彙總功能條件(您的情況COUNT)必須在HAVING聲明中使用。

+0

@jyparask你是對的,但我沒有完成編輯我的問題。 –

+0

呵呵,沒關係......我剛看到它,我想我應該提到它。 –

+0

第一個OP的查詢是(過度複製但是)是正確的 - 如果括號從第一行中刪除:SELECT DISTINCT TeamName ... –

1

你並不需要一個子查詢:

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

當您嘗試使用聚合來過濾數據時,您應該使用HAVING子句。 WHERE子句將引發錯誤。

所以在你的情況下No2是不正確的。

No1有一個subquery,它返回所有具有兩種不同顏色的球隊。那部分是正確的。但是,你有一個沒有意義的選擇。你可以使用:

SELECT TeamName FROM Playing GROUP BY TeamName HAVING COUNT(DISTINCT ShirtColor) = 2 
相關問題