1

私のクエリの目的は、国、首都、および話されている言語の数を返すことです。また、話されている言語の数の降順、次に大文字の順に並べる必要があります。最後に、言語の数は少なくとも5と10以下でなければなりません。

これが私の質問です:

SELECT country.name                    AS Country,
       city.name                       AS Capital,
       Count(countrylanguage.language) AS NumLanguages
FROM   country,
       city,
       countrylanguage
WHERE  city.id = country.capital
GROUP  BY city.name,
          country.name
HAVING ( Count(countrylanguage.language) BETWEEN 5 AND 10 ); 

何も返しません。都市名を表示するには、where句が必要です。国のテーブルにはID番号があり、都市のテーブルにはID番号と名前が含まれています。

誰かが私のエラーを見つけることができれば、私は非常に感謝しています!

4

1 に答える 1

4

との関係が欠落していcountrylanguageます。これがないと、デカルト積があるため、Count(countrylanguage.language)のレコード数はcountrylanguage10より大きくなる可能性が高くなります。

提案された解決策は次のとおりです(それに応じてフィールド名/ DB構造を調整します):

SELECT country.name                    AS Country,
       city.name                       AS Capital,
       Count(countrylanguage.language) AS NumLanguages
FROM   country,
       city,
       countrylanguage
WHERE  city.id = country.capital
AND    countrylanguage.language_id = country.language_id
GROUP  BY city.name,
          country.name
HAVING ( Count(countrylanguage.language) BETWEEN 5 AND 10 )
ORDER BY NumLanguages desc, city.Name

WHEREとはいえ、クエリの句での結合(暗黙的な結合)は常に避けてください。明示的(宣言的)結合を優先すると、読みやすさと柔軟性が向上します。

アップデート

コメントの提案に従って、ANSI-92結合構文を使用したクエリのバージョンは次のとおりです。

SELECT country.name                    AS Country,
       city.name                       AS Capital,
       Count(countrylanguage.language) AS NumLanguages
FROM       country
INNER JOIN city on city.id = country.capital
INNER JOIN countrylanguage on countrylanguage.language_id = country.language_id
GROUP  BY city.name,
          country.name
HAVING ( Count(countrylanguage.language) BETWEEN 5 AND 10 ); 
ORDER BY NumLanguages desc, city.Name
于 2012-09-17T20:47:35.923 に答える