Update & Group by [SQL] - SQL/NoSQL - Programmation
Marsh Posté le 22-07-2011 à 16:10:14
Quelle est la base de donnees que tu utilise ?
En oracle, avec un rownum tu peux essayer un truc style
Code :
|
qui ne te donnera pas un numero sequenciel mais te fournira un referent unique pour tes doublons.
Marsh Posté le 22-07-2011 à 16:29:16
Je suis sous SQL Server 2005...
J'avoue ne pas comprendre ton raisonnement, mon problème c'est de trouver un raccourci pour effectuer l'update cité sans avoir à comparer les nombreux champs pour faire ma jointure entre ma table à mettre à jour et ma table temporaire.
C'est peut-être plus clair si je ne prends pas des identifiants dans l'ordre :
Exemple avec champs à grouper :
12 NULL toto tata |
Après update je voudrais avoir :
12 12 toto tata |
Marsh Posté le 25-07-2011 à 11:29:45
Non, tu es condamné a comparer ta 30ene de champs.
Il y a bien un moyen de se passer de la table temporaire mais point de vue perf et complexité ca reviens au meme.
Marsh Posté le 22-07-2011 à 15:41:19
Bonjour,
Je cherche un technique performante pour réaliser la mise à jour d'un identifiant sur plusieurs lignes d'une table (SQL Server 2005) :
Table azerty :
id (int identity)
id2 (int)
ch1 (varchar(x))
ch2 (varchar(y))
ch3 (varchar(z))
ch4 (varchar(a))
ch5 (varchar(b))
...
Le but est de repérer les doublons sur plusieurs champs ch1, ch2, ch3, ch4, etc... et de coller un identifiant à toutes les lignes ayant les mêmes valeurs pour ces champs.
Exemple avec champs à grouper :
1 NULL toto tata
2 NULL toto titi
3 NULL tutu titi
4 NULL toto tata
5 NULL tutu titi
Après update je voudrais avoir :
1 1 toto tata
2 2 toto titi
3 3 tutu titi
4 1 toto tata
5 3 tutu titi
Donc logiquement je peux partir sur :
SELECT MIN(id) AS id, ch1, ch2
INTO #tmp
FROM azerty
GROUP BY ch1, ch2
Puis :
UPDATE a SET a.id2 = t.id
FROM azerty a, #tmp t
WHERE a.ch1 = z.ch1
AND a.ch2 = z.ch2
Le problème c'est que j'ai au moins une 30aine de champs à grouper donc je trouve ça laborieux de générer une table temporaire pour ensuite mettre à jour les données avec une jointure crado.
Existe-il un moyen pour faire ça en une seule fois sans avoir une jointure sur 30 champs (qui plus est avec des tests à la con dans cas de valeurs NULL) ?
Merci d'avance
Message édité par Twiddy le 22-07-2011 à 16:30:42