2011-01-29 18 views
0

テーブルの最大値を取得して別のクエリで使用する方法に大きな疑問を抱いています。Sql - 他のデータを選択するのに最大値を使用

この考えてみましょう:以下の要求は私の都市

SELECT peopleID, COUNT(*) 
FROM people 
GROUP BY cityID 

あたりの人々の数を示します

CREATE TABLE people 
(
    peopleID int NOT NULL, 
    cityID int NOT NULL 
) 

は、私は最大の都市の人々のリストをしたい、私は次のようにこの要求を書きますと仮定します。

SELECT people.peopleID, people.cityID 
FROM people, 
(
SELECT cityID, COUNT(*) AS "people_count" 
FROM people 
GROUP BY cityID 
) g 
WHERE people.cityID = g.cityID 
HAVING people_count = MIN(people_count) 

この問題を解決するにはどうすればよいですか?

感謝:)

+1

何データベースでは? –

+0

私は、データベースに依存しないソリューションであり、純粋なSQLプログラミングだけです。D –

+1

「純粋なSQL」とは何もありません。ANSIはデータベース全体に埋め込まれていません。 –

答えて

5

この技術は、ほとんどのデータベースで動作するはずです:

SELECT peopleID 
FROM people 
WHERE cityID = 
(
    SELECT cityID 
    FROM people 
    GROUP BY cityID 
    ORDER BY COUNT(*) DESC 
    LIMIT 1 
) 

LIMIT 1標準SQL(あなたが最初の1行をフェッチ使用する必要があり、標準状態)ではありません。データベースのさまざまな最初の行だけを取得する方法のリストについては、こちらをご覧ください:


編集:私はあなたの質問を誤解。ほぼすべてのSQLデータベースで簡単に修正できるこのクエリを実行するための賢明な方法を意味していると思いました。しかし実際には、正確にすべてのデータベースで同じ構文を使用して動作するように、クエリを書く方法を知りたいと思っています。誰も使用していないランダムなデータベースであっても、SQL標準を適切にサポートしていないものもあります。その場合、あなたはこれを試すことができますが、私は、あなたも、これは動作しませんデータベースを見つけることができると確信している:

SELECT peopleID, cityID 
FROM people 
WHERE cityID = (
    SELECT MAX(cityID) 
    FROM (
     SELECT cityID 
     FROM people 
     GROUP BY cityID 
     HAVING COUNT(*) = 
     (
      SELECT MAX(cnt) FROM 
      (
       SELECT cityID, COUNT(*) AS cnt 
       FROM people 
       GROUP BY cityID 
      ) T1 
     ) 
    ) T2 
) 
+0

Sybaseでは、LIMITまたはTOPはありません!/ –

+0

これはMySQLでしか動作しません.OPはDBの依存性解決策を尋ねました(コメント内) – Chandu

+1

@Arnaud F .:すべてのデータベースが標準SQLをサポートしているわけではありませんので、私は怖いです。 –

関連する問題