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 :

Pb d'update de colonne en utilisant 2 tables


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 90
    Par défaut Pb d'update de colonne en utilisant 2 tables
    Bonjour,

    Je n'arrive pas à écrire une requête qui semble pourtant très facile.
    J'ai deux tables :
    Table_A :
    ID_TBA
    LIB_TBA

    Table_B :
    ID_TBB
    ID_TBA
    LIB_TBB

    La table B est une table détail de la table A.
    Ce que j'essai de faire c'est mettre dans le champs LIB_TBB la valeur du champs LIB_TBA + ' ' + valeur du champs LIB_TBB.
    (Tous les enregistrements de mes tables ont tous leurs champs garnis)

    La requete que j'ai écris est la suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE Table_B GRP SET LIB_TBB = 
    (SELECT A.LIB_TBA||' '||B.LIB_TBB
    FROM Table_A A WHERE A.ID_TBA = B.ID_TBA);

    J'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00001: unique contraint (UK_01) violated
    La contrainte est la suivante :
    UK_01 unique (ID_TBA, LIB_TBB)

    J'ai évidement vérifié mes données et je pense que c'est la requête qui est mal écrite puisque logiquement, il ne peux pas y avoir de doublons...

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

    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
    Billets dans le blog
    4
    Par défaut
    Vérifie avec un select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select grp.*, (SELECT A.LIB_TBA||' '||B.LIB_TBB
    FROM Table_A A WHERE A.ID_TBA = B.ID_TBA) as newlib
    FROM Table_B GRP

  3. #3
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Tiens, je dirais même comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT b.id_tba, A.LIB_TBA||' '||B.LIB_TBB
    FROM table_b b 
        join table_a a ON a.id_tba = b.id_tba
    GROUP BY id_tba, A.LIB_TBA||' '||B.LIB_TBB
    having count(*) > 1

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 90
    Par défaut
    J'ai vérifié avec la requete de pacmann et ca confirme mes vérifications précédentes.
    Je comprends pas pourquoi ca fonctionne pas.

  5. #5
    Expert confirmé 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
    Par défaut
    Citation Envoyé par chtom Voir le message
    ...
    J'ai évidement vérifié mes données et je pense que c'est la requête qui est mal écrite puisque logiquement, il ne peux pas y avoir de doublons...
    Parfois, une contrainte unique peut être activée pour une table en dépit du fait que les données existantes ne respectent pas la contrainte. Mais dans ces cas une mise à jour de ces mêmes données impose que les nouvelles valeurs respectent la contrainte. En conclusion vérifiez aussi les données existant déjà dans votre table Table_B.

  6. #6
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    C'est surtout que j'ai tort et MCM raison !!

    En fait, il faut ouvrir la jointure pour ne pas zapper les éléements sans correspondance qui sont mis à NULL par ta requête.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT b.id_tba, A.LIB_TBA||' '||B.LIB_TBB
    FROM table_b b 
        LEFT OUTER JOIN table_a a ON a.id_tba = b.id_tba
    GROUP BY b.id_tba, A.LIB_TBA||' '||B.LIB_TBB
    HAVING count(*) > 1

    Après, je pense que la remarque de Mnitu serait prise en compte, vu que ta requête est sensée mettre à jour l'ensemble de la table...

  7. #7
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Citation Envoyé par pacmann Voir le message
    C'est surtout que j'ai tort et MCM raison !!

    En fait, il faut ouvrir la jointure pour ne pas zapper les éléements sans correspondance qui sont mis à NULL par ta requête.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT b.id_tba, A.LIB_TBA||' '||B.LIB_TBB
    FROM table_b b 
        LEFT OUTER JOIN table_a a ON a.id_tba = b.id_tba
    GROUP BY b.id_tba, A.LIB_TBA||' '||B.LIB_TBB
    HAVING count(*) > 1

    Après, je pense que la remarque de Mnitu serait prise en compte, vu que ta requête est sensée mettre à jour l'ensemble de la table...
    Essaie ça, car ça prend en compte les lignes que tu mets à NULL et qui peuvent être une source de doublons...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 90
    Par défaut
    En fait, j'ai simplifié le problème pour qu'il soit plus compréhensif mais je ne souhaites mettre à jour toutes les lignes mais seulement celle où LIB_TBB like 'TOTO%'

    Donc si j'intégre cette condition à la requête précédente :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT b.id_tba, A.LIB_TBA||' '||B.LIB_TBB
    FROM table_b b 
        LEFT OUTER JOIN table_a a ON a.id_tba = b.id_tba
    WHERE LIB_TBB like 'TOTO%'
    GROUP BY b.id_tba, A.LIB_TBA||' '||B.LIB_TBB
    HAVING count(*) > 1

    Je m'obtiens aucune ligne (ce qui est normal)

    Par contre sans ma clause WHERE, j'ai des lignes effectivement.

    Es-ce que ca peut vous aider ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 90
    Par défaut
    J'avais déjà regardé aussi...

    J'ai tenté de voir des doublons comme ceci :
    J'ai pris tous les enregistrements tel que + tous les futurs nouveau enregistrements.
    Résultat : aucun doublon.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select ID_TBA, LIB_TBB, count(*) from (
    select ID_TBA, LIB_TBB from table_b union
    SELECT b.ID_TBA, LIB_TBB||' '||B.LIB_TBB as LIB_TBB FROM Table_B b JOIN Table_A a ON a.ID_TBA = b.ID_TBA
    ) group by ID_TBA, LIB_TBB having count(*) > 1

    C'est un truc de dingue...

  10. #10
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Ta requête n'est pas exacte :
    Tous les éléments hors de la jointure seront également mis à jour... à NULL !

  11. #11
    Expert confirmé 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
    Par défaut
    Citation Envoyé par chtom Voir le message
    ...
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE Table_B GRP SET LIB_TBB = 
    (SELECT A.LIB_TBA||' '||B.LIB_TBB
    FROM Table_A A WHERE A.ID_TBA = B.ID_TBA);
    ...
    C'est requête ne peut pas fonctionner l'alias de la table TABLE_B est GRP et non pas B. Pourriez-vous poster votre requête ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 90
    Par défaut
    Pardon, j'ai nommé différement mes tables mais c'est bien ceci qu'il faut lire :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE Table_B B SET LIB_TBB = 
    (SELECT A.LIB_TBA||' '||B.LIB_TBB
    FROM Table_A A WHERE A.ID_TBA = B.ID_TBA);

    Merci.

  13. #13
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Citation Envoyé par chtom Voir le message
    Pardon, j'ai nommé différement mes tables mais c'est bien ceci qu'il faut lire :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE Table_B B SET LIB_TBB = 
    (SELECT A.LIB_TBA||' '||B.LIB_TBB
    FROM Table_A A WHERE A.ID_TBA = B.ID_TBA);

    Merci.
    Si tu as posté l'intégralité de ton update, il n'y a pas non plus de clause WHERE...

    Sinon, peux-tu donner la requête entière ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 90
    Par défaut
    Biensur...
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE Table_B B SET LIB_TBB = 
    (SELECT A.LIB_TBA||' '||B.LIB_TBB
    FROM Table_A A WHERE A.ID_TBA = B.ID_TBA AND LIB_TBB LIKE 'TOTO%'
    );

    Merci.

  15. #15
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    C'est normal :
    Tu updates toute la table B
    Si lib_tbb est différent de TOTO% le sous select va ramener NULL, donc tu vas updater lib_tbb à NULL

  16. #16
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT b.id_tba, A.LIB_TBA||' '||B.LIB_TBB
    FROM table_b b 
        LEFT OUTER JOIN table_a a ON a.id_tba = b.id_tba
    				AND LIB_TBB LIKE 'TOTO%'
    GROUP BY b.id_tba, A.LIB_TBA||' '||B.LIB_TBB
    HAVING count(*) > 1
    La clause WHERE à l'intérieur du SET, c'est ce qui précise la recherche du résultat.
    Par contre, ça ne délimité pas plus le périmètre des valeurs que tu mets à jour !

    => ce périmètre ce délimité dans le where au niveau de l'update (et non dans la partie corrélée)

    [EDIT] grillé par Mcm...

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 01/04/2008, 18h36
  2. Update de plusieur colonne d'une meme table
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/09/2006, 09h25
  3. [VBA-E]Redimenssionnez une colonne en utilisant son numéro
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/02/2006, 15h47
  4. update d'une IBQuery utilisant 2 table avec IBupdateSQL
    Par amad206 dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/02/2005, 10h51
  5. update du colonne avec entier incrementé
    Par superfly dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/05/2004, 17h26

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