2009-09-23 5 views
0

감안할 데이터 :복합 GROUP BY 절의 마지막 열에 대해 여러 값이있는 레코드를 어떻게 쿼리합니까? 이 유사합니다

+---------+-----------+----------+ 
| country | city  | district | 
+---------+-----------+----------+ 
| Japan | Tokyo  | 1  | 
| Japan | Tokyo  | 1  | 
| Japan | Tokyo  | 2  | 
| China | Shanghai | A  | 
| China | Shanghai | A  | 
| China | Shanghai | A  | 
| China | Beijing | X  | 
| China | Beijing | Y  | 
| China | Beijing | Z  | 
| India | Mumbai | 123  | 
| India | Mumbai | 123  | 
| India | Mumbai | 123  | 
| India | New Delhi | 321  | 
| India | New Delhi | 321  | 
| India | New Delhi | 321  | 
+---------+-----------+----------+ 

나는 내가 먼저 수행하여 시각적으로 데이터를 얻을 수 있습니다 알고

SELECT * from that_table 
GROUP BY country, city, district 

내가 불렀 :

+---------+-----------+----------+ 
| country | city  | district | 
+---------+-----------+----------+ 
| Japan | Tokyo  | 1  | 
| Japan | Tokyo  | 2  | 
| China | Shanghai | A  | 
| China | Beijing | X  | 
| China | Beijing | Y  | 
| China | Beijing | Z  | 
| India | Mumbai | 123  | 
| India | New Delhi | 321  | 
+---------+-----------+----------+ 

곳 나는 일본/동경과 중국/베이징 만이 지구에 대해 여러 가지 가치를 가지고 있음을 알 수있다. 그러나 나는 거대한 데이터 소스를 가지고 있으며 SQL에서 그렇게하고 싶습니다.

여러 개의 지구가있는 모든 국가/도시 조합을 가져 오기 위해 SQL 쿼리를 어떻게 작성합니까?

내가 달성하고 싶은 출력은 다음과 같습니다

+---------+-----------+----------+ 
| country | city  | district | 
+---------+-----------+----------+ 
| Japan | Tokyo  | 1  | 
| Japan | Tokyo  | 2  | 
| China | Beijing | X  | 
| China | Beijing | Y  | 
| China | Beijing | Z  | 
+---------+-----------+----------+ 
+0

왜 원본 데이터에 많은 중복 레코드가 있습니까? 세 번 (<인도, 뉴 델리, 321>과 같은) 말하면 더 이상 사실이 아닙니다. –

+0

귀하의 경우에는 선택 *가 특히 좋지 않습니다. 나는 거의 select *를 사용하지 않고, 정보 용 테이블을 쿼리 할 때만 사용하고, 실제 코드에서는 사용하지 않습니다. – Martin

+0

원본 데이터를 제어 할 권한이 없습니다. 데이터는 읽기 전용 액세스 만있는 이전 응용 프로그램의 데이터베이스에서 가져옵니다. –

답변

2
SELECT a.* 
FROM foo a 
    JOIN (
    SELECT country, city 
    FROM (SELECT distinct country, city, district FROM foo) 
    GROUP BY country, city 
    HAVING count(country) > 1) b 
    ON a.city = b.city AND a.country = b.country 
GROUP BY a.country, a.city, a.district 

결과 : 당신은 적어도 하나 개의 지역이 있어야하는 조건을 추가 할 수

COUNTRY CITY DISTRICT 
Japan Tokyo 2 
Japan Tokyo 1 
China Beijing Z 
China Beijing Y 
China Beijing X 
+0

제안 된 답변을 각각 확인한 후에이 대답만으로 정확한 결과를 얻을 수있었습니다. 감사! :) –

1
SELECT DISTINCT country, city, district FROM that_table tt1 
       JOIN (
        SELECT country, city from that_table 
        GROUP BY country, city 
        HAVING count(1) > 1) tt2 
       ON tt1.city = tt2.city 
       AND tt1.Country = tt2.country 
0

다른 도시와 같은 도시 :

SELECT a.* 
FROM YourTable a 
WHERE EXISTS (
    SELECT * 
    FROM YourTable b 
    WHERE a.Country = b.Country 
    AND a.City = b.City 
    AND a.District <> b.District 
)