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 :

Problème update trois tables [11g]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 716
    Par défaut Problème update trois tables
    Bonjour,

    J'ai une table sous Oracle11"table3" dont je dois mettre a jour le contenu en fonction d'un champ d'une autre table "table2", et le test dépend de "table2" et de "table1".

    J'ai essayé ceci sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    -- 599 records
    select t.tso_ref_mess,o.tdo_Num from table2 o,table1 i,table3 t where o.tdo_tin_id=tin_id and i.tin_tay_id=51 and t.tso_tdo_id=o.tdo_id
    => nombre de records existant a changer
     
    --234 866
    -- update table3 t SET t.tso_ref_mess=(select o.tdo_Num from table2 o,table1 i where o.tdo_tin_id=tin_id and i.tin_tay_id=51 and t.tso_tdo_id=o.tdo_id)
    => il me manque quelque chose !
    Merci de votre aide
    Phil

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    il vous manque une clause where a votre update.

    Sans une clause where vous updatez toute la table.

    Pour ce genre de cas, vous pouvez aussi regardez du côté du merge

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 716
    Par défaut
    re,

    j'a essaye avec clause Where, mais san succes

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Que signifie "sans succès" ?
    La requête ne s'exécute pas ?
    Le résultat n'est pas celui attendu ?
    Il y a un message d'erreur ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Je me suis penché sur tes requêtes.
    Un certain nombre de questions se posent.

    Dans un premier temps, il est toujours préféreable d'utiliser la syntaxe normalisée pour les jointures.
    Cela permet de mettre en évidence un potentiel produit cartésien avec table1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT t.tso_ref_mess
    	,  o.tdo_Num
    FROM    table2 o
        INNER JOIN
            table3 t
            ON  t.tso_tdo_id = o.tdo_id 
        CROSS JOIN
        	table1 i
    WHERE   i.tin_tay_id = 51 
        AND o.tdo_tin_id = tin_id 
    ;
    En effet, on ne sait pas si tin_id est une variable ou une colonne et, si c'est une colonne, à quelle table elle appartient.

    Je suppose que tin_id est une colonne de table1.
    La requête SELECT s'écrit alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT t.tso_ref_mess
    	,  o.tdo_Num
    FROM    table2 o
        INNER JOIN
            table3 t
            ON  t.tso_tdo_id = o.tdo_id 
        INNER JOIN
        	table1 i
            ON  o.tdo_tin_id = i.tin_id 
    WHERE   i.tin_tay_id = 51 
    ;
    Partant de là, la requête UPDATE pourrait s'écrire ainsi :
    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
    UPDATE  table3 tgt
    SET     tgt.tso_ref_mess 
            =   (   SELECT  o.tdo_Num
                    FROM    table2 o
                        INNER JOIN
                        	table1 i
                            ON  o.tdo_tin_id = i.tin_id 
                    WHERE   i.tin_tay_id = 51
                        AND tgt.tso_tdo_id = o.tdo_id
                )
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    table2 o
                    INNER JOIN
                    	table1 i
                        ON  o.tdo_tin_id = i.tin_id 
                WHERE   i.tin_tay_id = 51
                    AND tgt.tso_tdo_id = o.tdo_id
            )
    ;
    A noter que, s'il n'y avait pas de restriction (WHERE EXISTS ...), la colonne tgt.tso_ref_mess serait mise à NULL pour toutes les lignes de table3 qui ne sont pas liées à celles de la sous requête.

    Il reste toutefois une question : est-on certain qu'il n'y a qu'une ligne de table1 liée à chaque ligne de table2 ?
    Dans le cas contraire, la requête précédente ne peut fonctionner. On aurait plus d'une valeur retournée par la sous-requête pour chaque ligne de table3De plus, les colonnes de table1 ne sont utilisées qu'à des fins de restriction de l'ensemble de données traité.
    Il faudrait alors écrire :
    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
    UPDATE  table3 tgt
    SET     tgt.tso_ref_mess 
            =   (   SELECT  o.tdo_Num
                    FROM    table2 o
                    WHERE   EXISTS
                            (   SELECT  NULL
                                FROM    table1 i
                                WHERE   i.tin_tay_id = 51
                                    AND o.tdo_tin_id = i.tin_id 
                            )
                    WHERE   tgt.tso_tdo_id = o.tdo_id
                )
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    table2 o
                    INNER JOIN
                    	table1 i
                        ON  o.tdo_tin_id = i.tin_id 
                WHERE   i.tin_tay_id = 51
                    AND tgt.tso_tdo_id = o.tdo_id
            )
    ;
    Il serait toutefois dommage de ne pas profiter des possibilités de la commande MERGE pour en faie une requête efficace.
    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  table3 tgt
    USING   (   SELECT  o.tdo_Num
                    ,   o.tdo_id
                FROM    table2 o
                WHERE   EXISTS
                        (   SELECT  NULL
                            FROM    table1 i
                            WHERE   i.tin_tay_id = 51
                                AND o.tdo_tin_id = i.tin_id 
                        )
            )   src
    ON  (   tgt.tso_tdo_id = src.tdo_id   )
    WHEN MATCHED THEN UPDATE 
    SET     tgt.tso_ref_mess = src.tdo_Num
    WHERE   NOT (   tgt.tso_ref_mess = src.tdo_Num
                OR  (   tgt.tso_ref_mess    IS NULL
                    AND src.tdo_Num         IS NULL
                    )
                )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 716
    Par défaut
    Super, Merci
    Pb Resolu

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

Discussions similaires

  1. [AC-2003] problème update de table VBA vers table oracle
    Par valmelissa dans le forum VBA Access
    Réponses: 10
    Dernier message: 29/10/2009, 12h39
  2. problème update multi-tables
    Par steevest dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/10/2009, 11h44
  3. Problème de jointure trois tables
    Par patrick58 dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/11/2008, 20h08
  4. Probléme de relation entre trois tables
    Par Myogtha dans le forum Modélisation
    Réponses: 18
    Dernier message: 06/05/2008, 13h32
  5. Problème update des tables
    Par PC81 dans le forum VBA Access
    Réponses: 9
    Dernier message: 15/04/2008, 11h10

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