Bonjour à tous,
j'ai parcouru les forums, les docs, le web sans trouver de réponse à mon problème :
J'ai 2 tables:
TABLE1 contient donc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE TABLE TABLE1 (RELIDX INTEGER, WORIDX INTEGER, WEIIDX INTEGER, RELIND INTEGER ) INSERT INTO TABLE1 (1, 32, 123, 5) INSERT INTO TABLE1 (2, 32, 413, 9) INSERT INTO TABLE1 (3, 32, 1269, 15)
RELIDX,WORIDX,WEIIDX,RELIND
1,32,123,5
2,32,413,9
3,32,1269,15
TABLE2 contient donc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE TABLE TABLE2 (WEIIDX INTEGER, WEIVALUE INTEGER ) INSERT INTO TABLE1 (123, 600) INSERT INTO TABLE1 (413, 950) INSERT INTO TABLE1 (1269, 350)
WEIIDX,WEIVALUE
123,600
413,950
1269,350
Le but du jeu est de trouver pour chaque WORIDX de TABLE1 le min des RELIND correspondants.
Select min(RELIND) from TABLE1 GROUP BY WORIDX
Donne l'enregistrement (1,32,123,5).
Appelons RELINDREF la valeur de RELIND pour cet enregistrement (=5).
Pour cet enregistrement on récupère le WEIIDX (=123) qui permet de faire la jointure avec TABLE2 et récupérer la valeur du WEIVALUE correspondante. Appelons ça WEIVALUEREF (=600).
Ensuite pour chaque enregistrement de TABLE1 ayant le même WORIDX, je récupère la valeur du TABLE2.WEIVALUE. Si cette valeur est > WEIVALUEREF alors le TABLE1.RELIND correspondant prend la valeur RELINDREF.
Dans l'exemple, c'est le cas du deuxième enregistrement de TABLE1 pour lequel la valeur de WEIVALUE est 950. Le RELIND de cet enregistrement (9) prend la valeur 5. Le troisième n'est pas modifié car le WEIVALUE qui lui correspond est < WEIVALUEREF.
Au final je veux donc me retrouver avec TABLE1 contenant :
RELIDX,WORIDX,WEIIDX,RELIND
1,32,123,5
2,32,413,5
3,32,1269,15
Ces tables contiennent des centaines de milliers d'enregistrements, je ne peux donc pas me permettre trop de fantaisies pour des questions de perfs.
Qui serait capable de faire cet update en 1 requête ?
Contrainte : il faut que la requête soit compatible avec MySQL donc pas d'utilisation de la même table dans l'update et dans des sous-select.
J'ai essayé avec des variables, sans succès.
Partager