J'ai une table comme celle-ci J'ai besoin d'une requête qui retournera tous les champs (sélectionnez *) dans les enregistrements qui ont le même nachname et Vorname (dans ce cas, enregistrements 1 et 2).
Est-ce que quelqu'un peut m'aider avec ça? Merci p> p>
4 Réponses :
La solution générale à votre problème est une requête du formulaire
SELECT id FROM t1, ( SELECT col1, col2, count(*) FROM t1 GROUP BY col1, col2 HAVING count(*) > 1 ) as t2 WHERE t1.col1 = t2.col1 AND t1.col2 = t2.col2
Cela ne retournerait pas toutes les lignes, il ne ferait que trouver les lignes en double.
C'est un moyen coûteux, vous pouvez le résoudre à l'aide d'une jointure simple (voir ma réponse: p).
select * from table AS t1 inner join (select max(id) As id,nachname,vorname, count(*) from t1 group by nachname,vorname having count(*) >1) AS t2 on t1.id=t2.id This should return ALL of the columns from the table where there is duplicate nachname and vorname. I recommend changing * to the exact columns that you need.Edit: I added a max(id) so that the group by wouldn't be a problem. My query isn't as elegant as I would want though. There's probably an easier way to do it.
Hmm ... je vois ce que tu veux dire maintenant. Mais je suis à peu près sûr que votre requête est fausse. Vous ne pouvez pas retourner id code> si vous n'utilisez pas le groupe par code>.
Cette jointure ne fonctionne pas - il n'y a pas de colonne code> ID code> dans la requête T2.
Ceci est juste très faux ... Le groupe par volonté éliminera les doublons que vous avez si vous utilisez MySQL, car vous ne regroupez que Nachname et Vorname, il retournera donc 1 ligne, avec 1 ID, au lieu de toutes les lignes distinctives. Comme vous êtes probablement attendu (essayez-le, vous verrez). Oh, et tout autre SGBDM se plaint de votre groupe par (qui est imho la seule façon correcte, je déteste MySQL essayant de deviner ce que vous voulez et exécutez ces requêtes erronées au lieu de lancer une erreur).
Vous pouvez le faire avec une jointure auto-jointure: t1.id <> t2.id code> est nécessaire pour éviter les identifiants correspondant à eux-mêmes. (Si vous ne voulez que 1 rangée de chaque ensemble de duplicats, vous pouvez utiliser t1.id
Nope, celui-là ne rentrera que 1 rangée avec les 2 enregistrements correspondants, pas les 2 rangées qu'il devraient revenir ...
@wimvds True, si vous voulez toutes les lignes en double (au lieu de 1 rangée de chaque ensemble en double, vous devez utiliser <>)
La requête suivante donnera à la liste des doublons:
SELECT n1.* FROM table n1 inner join table n2 on n2.vorname=n1.vorname and n2.nachname=n1.nachname where n1.id <> n2.id
J'ai juste besoin d'ajouter Sélectionner distinct (la requête renvoyait 2 fois la même ligne). Merci de votre aide
Remarque: Si les champs "Vorname" et "Nachname" sont nullables, la fonction "regroupement" doit être utilisée pour une comparaison. Voir: Stackoverflow.com/questions/9608639 / ...