2011-01-29 4 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 (처음 1 ROWS ONLY을 FETCH 사용해야하는 표준 상태) 표준 SQL이 아니다. 다양한 데이터베이스에서 첫 번째 행을 인출하는 방법의 목록을 보려면 여기를 참조하십시오 :


편집 : 나는 당신의 질문을 오해. 거의 모든 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을 지원하지는 않습니다. 나는 두려워. –

관련 문제