2009-09-23 5 views
0

Compte tenu des données qui ressemble à ceci:Comment rechercher des enregistrements avec plusieurs valeurs pour la dernière colonne d'une clause GROUP BY composée?

+---------+-----------+----------+ 
| 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  | 
+---------+-----------+----------+ 

Je sais que je peux obtenir les données visuellement par faire d'abord:

SELECT * from that_table 
GROUP BY country, city, district 

Je me suis arrangé:

+---------+-----------+----------+ 
| 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  | 
+---------+-----------+----------+ 

où Je peux voir que seuls le Japon/Tokyo et la Chine/Beijing ont plusieurs valeurs pour District. Cependant, j'ai une énorme source de données et j'aimerais le faire en SQL. Comment puis-je former la requête SQL pour obtenir toutes les combinaisons pays/ville avec plusieurs districts?

La sortie Je voudrais obtenir est:

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

Pourquoi les données sources contiennent-elles autant d'enregistrements en double? Dire quelque chose trois fois (comme ) ne le rend pas plus vrai. –

+0

Dans votre cas, sélectionnez * est très mauvais, surtout avec un groupe de. J'utilise rarement select *, je ne l'utilise que pour interroger des tables pour des informations, jamais en code réel. – Martin

+0

Je n'ai aucun contrôle sur les données source. Les données proviennent de la base de données d'une ancienne application à laquelle je n'ai accès qu'en lecture seule. –

Répondre

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 

Résultat:

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

Après avoir vérifié chacune des réponses suggérées, seule cette réponse m'a fourni la sortie correcte. Merci! :) –

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

Vous pouvez ajouter une condition qu'il doit y avoir au moins un district la même ville avec un nom différent:

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 
) 
Questions connexes