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 :

Comparer valeur de deux tables


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 122
    Points : 54
    Points
    54
    Par défaut Comparer valeur de deux tables
    Bonjour je suis sous Oracle 10g.

    Je veux faire la comparaison des des données de deux tables.
    Ce sont deux tables identiques mais une qui servira d'historique.
    La table histotique aura quatre colonnes supplémentaires.

    J'ai penser faire une boucle imbriqué afin de lire chaque ligne des deux tables silmutanémment afin de voir s'il y a des différences dans une valeur de colonne des deux tables. Si oui je dois faire un DML.

    Est-ce que c'est la bonne façon ou bien il y a de quoi de plus performant?

    Merci!!!

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    DECLARE
    V_DATE_DEBUT_OPER DATE;
     
    CURSOR CUR_i_PAYS IS
       SELECT PAYS.CODE_PAYS, PAYS.CODE_REGION_MONDIALE, PAYS.NOM_LONG_PAYS, PAYS.NOM_PAYS
         FROM I_PAYS PAYS;
     
      REC_I_PAYS  CUR_I_PAYS%ROWTYPE;
     
    CURSOR CUR_i_PAYS_H IS
       SELECT PAYS.CODE_PAYS, PAYS.CODE_REGION_MONDIALE, PAYS.NOM_LONG_PAYS, PAYS.NOM_PAYS,
                   PAYS.NO_VERSION_H, PAYS.HORODATE_AJOUT_H, PAYS.HORODATE_DESACTIVATION_H, PAYS.INDIC_ACTIF_H
         FROM I_PAYS_H PAYS;
     
      REC_I_PAYS_H CUR_I_PAYS_H%ROWTYPE;
     
     
    BEGIN
    V_DATE_DEBUT_OPER := TRUNC(SYSDATE);
     
    FOR REC_I_PAYS IN CUR_I_PAYS LOOP
       FOR REC_I_PAYS_H IN CUR_I_PAYS_H LOOP
        IF REC_I_PAYS_H.INDIC_ACTIF_H = 1 THEN
          IF REC_I_PAYS.CODE_PAYS <>  REC_I_PAYS_H.CODE_PAYS THEN
            UPDATE I_PAYS_H SET HORODATE_DESACTIVATION_H = V_DATE_DEBUT_OPER;
            UPDATE I_PAYS_H SET INDIC_ACTIF_H = 1;
          END IF;
        END IF;
         END LOOP;
     END LOOP;
     
     END;

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Marcel Chabot Voir le message
    Est-ce que c'est la bonne façon ou bien il y a de quoi de plus performant?
    Y a bien plus performant en se passant des curseurs et en faisant une requête globale

    Trois questions sur ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE I_PAYS_H SET HORODATE_DESACTIVATION_H = V_DATE_DEBUT_OPER;
    UPDATE I_PAYS_H SET INDIC_ACTIF_H = 1;
    Pourquoi faire deux update au lieu d'un?
    Tu fais un UPDATE sur l'ensemble de la table, sans clause WHERE? C'est vraiment ce que tu veux??
    Pas de COMMIT dans le code?

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    La bonne façon de faire c'est en SQL.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 122
    Points : 54
    Points
    54
    Par défaut
    Je suis pas super bon en SQL ;-)

    Certain que j'aimerais faire un update au lieu de deux!
    Je vais fouiller pour voir comment ça se fait ;-)
    Certain aussi que c'est pas sur l'ensemble de la table historique que je veux faire un update mais seulement sur les lignes qui ne répondent pas aux critères demandés.

    J'utilise deux curseurs pour voir quelle valeur de la table source est différente de la table cible (Historique).
    Ensuite je dois faire un update sur la table cible de la ligne qui n'est pas pareille à la table cible.

    Tu as bien raison, je vais faire une clause where pour comparer les deux clés primaires de chaque table pour faire le update de cette ligne seulement et non de l'ensemble de la table.
    Et un commit c'est sur.

    Est-ce que c'est bien ça?

    Il faudrait surement que je crée un curseur qui contient mes deux select.
    Afin de mettre ma clause where pour comparer la même ligne dans chaque table ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Avec le peu d'info que tu donnes, ça devrais ressembler à ça - j'ai pas testé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE I_PAYS_H IPH
    SET IPH.HORODATE_DESACTIVATION_H = TRUNC(SYSDATE),
    	IPH.INDIC_ACTIF_H = 1
    JOIN I_PAYS IP
    	on IP.CODE_PAYS = IPH.CODE_PAYS -- clef étrangère des deux tables
    where IPH.champ1 != IP.champ1
    	or IPH.champ2 != IP.champ2
    Il faudrait que tu te mettes sérieusement au SQL. Il y a plein de tutoriels sur ce site...

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Update ...
       Set ...
    Join ...
    Where ...
    ça ne passe pas chez Oracle.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Update ...
       Set ...
    Join ...
    Where ...
    ça ne passe pas chez Oracle.
    M*** j'suis devenu rouillé en Oracle
    Au moins un avantage avec slq server sur l'écriture de ce genre de chose...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 60
    Points
    60
    Par défaut
    Bonjour,
    A la sauce Oracle ca donnerait quelque chose comme ca.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE I_PAYS_H IPH
    SET IPH.HORODATE_DESACTIVATION_H = TRUNC(SYSDATE),
          IPH.INDIC_ACTIF_H = 1
    WHERE EXISTS ( SELECT 1 FROM I_PAYS IP 
                            WHERE IP.CODE_PAYS = IPH.CODE_PAYS 
                            AND ( IPH.champ1 != IP.champ1 OR IPH.champ2 != IP.champ2 )
                   )

    Je ne l'ai pas teste mais au pire l'idee est la

    edit : J'ai vraiment du mal a faire ma mise en forme avec ce forum ...

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

Discussions similaires

  1. [XL-2007] Comparer valeurs de deux cellules avec un bouton valider
    Par Merryy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/06/2015, 14h53
  2. [MySQL] Insérer une valeur dans deux tables
    Par nongidog dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 23/10/2014, 14h18
  3. récupéré les valeur de deux table ensemble
    Par yassin123441 dans le forum Linq
    Réponses: 4
    Dernier message: 08/04/2011, 09h02
  4. [MySQL] Comparer deux valeurs depuis deux tables
    Par jbidou88 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 03/03/2008, 14h20
  5. [VB.net] Comparer valeurs d'une table à une variable
    Par collaud_vb dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/09/2006, 15h24

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