Salut à tous.
Je constitue dans une table temporaire, exactement ce que je désire obtenir.
Si j'ai procéder ainsi, c'est juste pour vérifier que le résultat correspond exactement à ce que j'attendais, avant de faire la suppression.
J'ai décomposé en deux étapes afin de montrer que je récupère uniquement ce dont j'ai besoin.
a) j'ai extrait uniquement les lignes qui n'ont pas de doublons --> "having(count(*) = 1".
b) j'ai extrait les lignes qui ont des doublons en conservant uniquement la première occurrence --> "having(count(*) > 1".
Et je fusionne ces deux étapes. Les doublons seront supprimés dans la table 'test' !
Quand je fais la suppression, je fais un "where id not in (" afin de supprimer tous les 'id' qui sont en trop, c'est-à-dire les doublons.
Donc non, je n'ai pas supprimé l'original comme tu le prétends !
Et j'ai testé mon exemple avant de fournir la solution, afin de m'assurer que c'est correct et que cela correspond à la demande de sinail .
@ Antoun : je suppose que tu n'as testé ton exemple. J'ai vérifié sur un exemple et cela ne fonctionne pas.
D'accord, mais j'ai cru bien faire en décomposant la requête.
Qu'on externalise la table temporaire ou pas, au final, elle est quand même créée.
@ tous : Je reprends mon exemple et je vous donne la solution condensée, puisque cela dérange que je décompose en deux étapes.
1 2 3 4 5 6 7 8 9 10 11
| delete from doublon
where id not in (
select id from (
select id
from (
select id
from doublon
group by tri, val
) as x
) y
); |
J'ai testé et cela fonctionne !
Inutile de faire un where compliqué car c'est le 'group by' qui se charge de supprimer les doublons.
Les doublons sont sur le couple (tri ; val).
@+
Partager