2009-08-17 9 views
4

Voici un exemple de tableau pour illustrer mon problème:Comment exclure les doublons lors de l'assemblage d'une table avec elle-même

mysql> select * from test; 
+----+--------------+--------+ 
| id | type   | siteid | 
+----+--------------+--------+ 
| 1 | First Visit | 100 | 
| 2 | Second Visit | 100 | 
| 3 | First Visit | 300 | 
| 4 | First Visit | 400 | 
| 5 | Second Visit | 500 | 
| 6 | Second Visit | 600 | 
+----+--------------+--------+ 

Je suis en train de se joindre à la table sur elle-même, pour tirer ensemble les lignes qui ont la même valeur siteid Voici ma tentative:

mysql> select * from test T1 
    -> LEFT OUTER JOIN test T2 on T1.siteid = T2.siteid and T1.id <> T2.id; 
+----+--------------+--------+------+--------------+--------+ 
| id | type   | siteid | id | type   | siteid | 
+----+--------------+--------+------+--------------+--------+ 
| 1 | First Visit | 100 | 2 | Second Visit | 100 | 
| 2 | Second Visit | 100 | 1 | First Visit | 100 | 
| 3 | First Visit | 300 | NULL | NULL   | NULL | 
| 4 | First Visit | 400 | NULL | NULL   | NULL | 
| 5 | Second Visit | 500 | NULL | NULL   | NULL | 
| 6 | Second Visit | 600 | NULL | NULL   | NULL | 
+----+--------------+--------+------+--------------+--------+ 

Ceci est fondamentalement le résultat que je recherche, sauf pour les 2 premières lignes. Je voudrais en éliminer un. Donc, j'ai essayé ce qui suit:

mysql> select * from test T1 
    -> LEFT OUTER JOIN test T2 on T1.siteid = T2.siteid and T1.id <> T2.id 
    -> GROUP BY T1.siteid; 
+----+--------------+--------+------+--------------+--------+ 
| id | type   | siteid | id | type   | siteid | 
+----+--------------+--------+------+--------------+--------+ 
| 1 | First Visit | 100 | 2 | Second Visit | 100 | 
| 3 | First Visit | 300 | NULL | NULL   | NULL | 
| 4 | First Visit | 400 | NULL | NULL   | NULL | 
| 5 | Second Visit | 500 | NULL | NULL   | NULL | 
| 6 | Second Visit | 600 | NULL | NULL   | NULL | 
+----+--------------+--------+------+--------------+--------+ 

C'est exactement la sortie que je recherche. Cependant, je viens d'apprendre que ce n'est pas la manière standard d'utiliser GROUP BY, et l'instruction ci-dessus échoue sur ORACLE, ce qui me donne un

Erreur SQL générale.
ORA-00979: pas GROUP BY expression

Quelqu'un peut-il offrir une aide sur la façon d'obtenir les résultats comme la dernière table et qui fonctionne avec ORACLE?

Répondre

6

Il suffit de supprimer un seul caractère de votre requête, et il va faire le travail ... (remplacer « <> » avec « < »):

select * from test T1 
LEFT OUTER JOIN test T2 on T1.siteid = T2.siteid and T1.id < T2.id