Bonjour à tous,
Je suis actuellement en train de travailler sur une requête SQL qui me permettrait de mettre à jour le champ d’une table en fonction du contenu de deux autres tables. Mais je galère un peu, je me permets donc de demander votre aide .
Je m’explique:
J’ai trois tables : Ville, Entrepot1 et Entrepot2.
La table Ville contient une clé primaire qui est Name. De même pour les tables Entrepot1 et Entrepot2.
Le champ CityName est une clé étrangère dans Entrepot1 et Entrepot2 du champ Name de la table Ville.
Ci-dessous un exemple du contenu de ces tables.
Ville
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Name Month MaxRef Paris January 0 Marseille February 0
Entrepot1
Entrepot2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Name CityName Reference Paris_1 Paris 1 Paris_2 Paris 0 Marseille_1 Marseille 10 Marseille_2 Marseille 0
Je cherche, pour chaque ville de la table Ville (donc chaque ligne), à récupérer le maximum du champ Reference des tables Entrepot1 et Entrepot2 pour le CityName correspondant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Name CityName Reference Paris_3 Paris 0 Paris_4 Paris 1 Paris_5 Paris 50 Marseille_3 Marseille 200
Dans mon exemple ci-dessus, pour la ville Paris, dans la table Entrepot1, il y a deux valeurs possibles pour Reference pour Paris: 1 et 0. Dans la table Entrepot2, il y a trois valeurs possibles pour Reference pour Paris: 0, 1 et 50.
Je recherche donc le maximum des deux tables Entrepot1 et Entrepot2, cad : max(1, 0, 0, 1, 50)=50. Cette valeur 50 doit alors être mise dans la table Ville pour le champ Paris.
J’ai commencé à écrire un script PL/SQL, mais j’obtiens l’erreur ORA—00904 (Identificateur non valide), portant a priori sur l'egalité var1.name = var2.name.
J'ai pensé au PL/SQL pour cette manipulation, mais je reste persuadé qu'une simple requête SQL fasse l'affaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 BEGIN FOR var1 IN (select v.name as name, max(e.Reference) as eRef from Entrepot1 e, Ville v where e.CityName = v.name group by v.name) LOOP BEGIN FOR var2 IN (SELECT name, MAXREF FROM Ville) LOOP IF (UPPER(var1.name) <> UPPER(var2.name)) THEN IF (var1.eRef > var2.MAXREF) THEN EXECUTE IMMEDIATE 'update Ville set MAXREF = ' || var1.eRef || ' where name = ' || var1.name; END IF; END IF; END LOOP; END; END LOOP; END; /
Si quelqu'un comprend ce que j'ai raconté ici et peut m'aider, je suis preneur .
Merci d'avance pour votre aide.
Partager