IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Requête upgrade comparer plusieurs valeurs


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Requête upgrade comparer plusieurs valeurs
    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

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE tab_a a
    set prix = (SELECT MAX(prix)KEEP (DENSE_RANK FIRST ORDER BY b.dte desc) prx
    		FROM tab_b b WHERE b.x = a.x AND b.dte < a.dte)
     
    SELECT * FROM tab_a
     
    X	Y	PRIX	DTE
    PARIS	ROUTE	3	05/05/2012
    LONDRES	CHEMIN	2	14/05/2012
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup pour ta réponse rapide.

    Je connaissais pas du tout les fonctions analytiques en SQL.

    J'aurais dû demander plus tôt

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    une alternative, qui aura un comportement légèrement différend : elle ne mettra pas de null pour les lignes de A n'ayant aucun correspondance dans B.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    MERGE INTO TAB_A A
    USING (
      SELECT 
          A.X
          , A.Y
          , B.prix  prixB
          ,ROW_NUMBER() OVER(PARTITION BY A.X,A.Y ORDER BY B.dat DESC) rn
      FROM TAB_A A
      INNER JOIN TAB_B B
        on B.X = A.X
        and B.Y= A.y
        and B.dat <= A.dat
     
     ) B
      on (B.X = A.X
      and B.Y= A.y
      and rn = 1)
    WHEN MATCHED THEN 
    UPDATE SET prix = prixB;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 31/01/2013, 10h56
  2. [AC-2003] Comparer plusieurs valeurs avec un Dlookup
    Par Skootman dans le forum VBA Access
    Réponses: 9
    Dernier message: 12/04/2011, 10h01
  3. Réponses: 7
    Dernier message: 17/03/2010, 11h01
  4. [MySQL] Comparer plusieurs valeur d'un tableau php
    Par worldhugo dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 28/04/2009, 16h26
  5. Réponses: 4
    Dernier message: 07/07/2008, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo