2017-03-21 9 views
0

私はかなり新しいSQLですが、これに対する答えをインターネットで検索しましたが、私が望むものを選択するためにCOUNTとEXCEPTステートメントを取得できません。sqlite3:COUNT&EXCEPTが期待どおりに動作しない

マイデータベース:

sqlite> CREATE TABLE Football(Team TEXT, Player TEXT, Age INTEGER, primary key(Team, Player)); 
sqlite> .separator , 
sqlite> .import databaseTest Football 
sqlite> .headers on 
sqlite> .mode col 
sqlite> SELECT Team, Player, Age FROM Football ORDER BY Team; 
Team  Player  Age  
---------- ---------- ---------- 
Arsenal  Cech  38   
Arsenal  Giroud  29   
Arsenal  Sanchez  28   
Arsenal  Walcott  27   
Chelsea  Costa  29   
Chelsea  Courtois 25   
Chelsea  Hazard  26   
Chelsea  Willian  26   
Liverpool Can   23   
Liverpool Coutinho 24   
Liverpool Wjinaldum 25   
Liverpool Woodburn 17   
Manchester Aguero  29   
Manchester Jesus  19   
Manchester Silva  28   
Manchester Toure  34   
Manchester De Gea  26   
Manchester Felliani 29   
Manchester Rooney  32   
Manchester Schweinste 35   
Tottenham Delle Ali 22   
Tottenham Kane  24   
Tottenham Rose  24   
Tottenham Vertonghen 27 

私がやりたいことはあるSELECT 30歳以上のプレーヤーを持っていないチームのCOUNTだからselect文があるべき3(チェルシー、リバプール、トッテナム)。

これは、私が試したと仮定してきた文が働くだろうです:

sqlite> SELECT COUNT(DISTINCT Team) FROM Football 
...> EXCEPT 
...> SELECT COUNT(DISTINCT Team) FROM Football WHERE Age > 30; 
COUNT(DISTINCT Team) 
-------------------- 
6  

しかし、あなたはそれを返し見ることができるように「6」。私は間違って何をしていますか、どうすれば正しい結果を得ることができますか?

答えて

1

これは別の方法です。各チームの最大の年齢を見てください:

SELECT COUNT(*) 
FROM (SELECT Team 
     FROM Football 
     GROUP BY Team 
     HAVING MAX(Age) <= 30 
    ) t; 

またEXCEPTを使用することができますが、これはまた、サブクエリが必要です。あなたは、カウントを行う前に集合演算を実行する必要があります。

SELECT COUNT(DISTINCT TEAM) 
FROM (SELECT Team FROM Football 
     EXCEPT 
     SELECT Team FROM Football WHERE Age > 30 
    ) t; 

は、厳密に言えば、このクエリではなくCOUNT(DISTINCT)よりもCOUNT(*)を使用することができます。しかし、EXCEPTUNIONのような)が重複する値を削除することを覚えておくのは面倒かもしれません。

+0

ありがとうございました! HAVINGを使用すると、実際にはもっと意味があります。以前はHAVINGを使って調べていましたが、オンラインで検索することでそれに関する特定の良い情報を見つけることはできませんでした。再度、感謝します。 – JLW

関連する問題