2011-01-29 38 views
0

我很懷疑如何檢索表的最大值並在另一個查詢中使用它。Sql - 使用最大的值來選擇其他數據

考慮一下:

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

以下請求給我

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

假設我想最大的城市的人名單,我會寫這樣的請求,每個城市的人數:

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,因此這是不可能的,恐怕。 –