Bonjour,

J'ai un gros problème depuis plusieurs temps que je pensais avoir résolu, mais il se trouve que non.

Je dois mettre à jour une colonne dans une table A (comportant notamment une date) grâce à une autre table B (comportant également une date).
Jusque là ça va.

Mais le problème est que pour mettre à jour la table A, je dois croiser les 2 tables (FAIT) et prendre la dateB la plus récente (qui peut être différente d'une ligne à l'autre) et qui est inférieur à la dateA.

Exemple :
CHAMPS TAB_A TAB_B TAB_B TAB_B
X 'PARIS' 'PARIS' 'PARIS' 'PARIS'
Y 'ROUTE' 'ROUTE' 'ROUTE' 'ROUTE'
PRIX 2 3 4
DATE 05/05/12 01/01/11 01/01/12 01/01/13

CHAMPS TAB_A TAB_B TAB_B TAB_B
X 'LONDRES' 'LONDRES' 'LONDRES' 'LONDRES'
Y 'CHEMIN' 'CHEMIN' 'CHEMIN' 'CHEMIN'
PRIX 2 3 4
DATE 14/05/12 01/01/11 01/06/12 01/01/13

Le prix du champs donc X = 'PARIS' doit être mise à jour à 3.
Le prix du champs donc X = 'LONDRES' doit être mise à jour à 2.

J'ai essayé plusieurs méthodes mais cela ne fonctionne pas (également avec une clause WITH) :

Exemple:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
UPDATE TAB_A L
SET L.PRIX =
  (SELECT PRIX
   FROM
      (SELECT T.PRIX
           FROM TAB_B T
           WHERE L.X = T.X
           AND L.Y = T.Y
           AND T.DATE <= L.DATE
           ORDER BY T.DATE
       )
  WHERE rownum <=1
  );
Je veux également éviter de faire de cette manière car trop long pour ma tâche :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
UPDATE TAB_A L
SET L.PRIX =
     (SELECT T.PRIX
          FROM TAB_B T
          WHERE T.X = L.X
          AND T.Y     = L.Y
          AND T.DATE =
               (SELECT MAX(DATE) FROM TAB_B
                     WHERE  X = L.X
                     AND Y = L.Y
                     AND DATE <= L.DATE
               )
     );
Si quelqu'un peut m'aider ce serait COOL
Merci