[SQL] Update & Group by

Update & Group by [SQL] - SQL/NoSQL - Programmation

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
Reply

Marsh Posté le 22-07-2011 à 15:41:19   

Reply

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 :
  1. select id1, id2, max(rownum)
  2. from table
  3. group by id1, id2


qui ne te donnera pas un numero sequenciel mais te fournira un referent unique pour tes doublons.

Reply

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
23 NULL toto titi
32 NULL tutu titi
48 NULL toto tata
54 NULL tutu titi


 
Après update je voudrais avoir :  

12 12 toto tata
23 23 toto titi
32 32 tutu titi
48 12 toto tata
54 32 tutu titi


Reply

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.

Reply

Marsh Posté le 25-07-2011 à 11:33:52    

Arf, merci. Je m'en doutais un peu...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed