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

PL/SQL Oracle Discussion :

UPDATE avec jointure complexe


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 312
    Par défaut UPDATE avec jointure complexe
    Bonjour,
    Pour les besoins de mon application, je dois migrer une clé primaire composite (deux champs) vers une clé primaire unique (nouveau champs de type NUMBER).

    Je dois en outre modifier les liaison entre les table et migrer la nouvelle clé su r celle-ci.

    Pour cela j'aimerai utiliser une requête de type UPDATE TABLE avec SELECT et une jointure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE TBLCONSTRUCTION e
       SET e.CLELIGNECOMMANDECLIENT = (SELECT s.cle
                                         FROM TBLCONSTRUCTION e
                                              INNER JOIN TBLCOMMANDE s
                                                ON e.clecommande = s.clecommande
                                               AND e.numeroligne = s.numeroligne
                                        WHERE S.CLECOMMANDE = E.CLECOMMANDE
                                          and S.NUMEROLIGNE = E.NUMEROLIGNE);
    Or cela ne marche pas car je n'arrive pas a générer une requête qui sortira uniquement la ligne désiré (ORA-01427 single-row subquery returns more than one row) . Suis-je obligé d’utiliser un curseur ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Le message d'erreur signifie que le critère de jointure précisé retourne plus d'une ligne, ce qui est fâcheux pour construire une clef primaire.

    Maintenant si vous lisez bien votre requête, vous utilisez deux fois le même alias de table à deux niveaux différents, comment voulez-vous qu'Oracle s'y retrouve ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 312
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Le message d'erreur signifie que le critère de jointure précisé retourne plus d'une ligne, ce qui est fâcheux pour construire une clef primaire.

    Maintenant si vous lisez bien votre requête, vous utilisez deux fois le même alias de table à deux niveaux différents, comment voulez-vous qu'Oracle s'y retrouve ?
    En executant ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UPDATE TBLCONSTRUCTION h
       SET h.CLELIGNECOMMANDECLIENT = (SELECT s.cle
                                         FROM TBLCONSTRUCTION e
                                              INNER JOIN TBLCOMMANDE s
                                                ON e.clecommande = s.clecommande
                                               AND e.numeroligne = s.numeroligne
                                        WHERE S.CLECOMMANDE = E.CLECOMMANDE
                                          AND S.NUMEROLIGNE = E.NUMEROLIGNE);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UPDATE TBLCONSTRUCTION h
       SET h.CLELIGNECOMMANDECLIENT = (SELECT s.cle
                                         FROM TBLCONSTRUCTION e
                                              INNER JOIN TBLCOMMANDE s
                                                ON h.clecommande = s.clecommande
                                               AND h.numeroligne = s.numeroligne
                                        WHERE S.CLECOMMANDE = E.CLECOMMANDE
                                          AND S.NUMEROLIGNE = E.NUMEROLIGNE);
    Ca ne marche pas mieux ....

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    C'est normal, aucun des deux n'est correct !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE TBLCONSTRUCTION h
       SET h.CLELIGNECOMMANDECLIENT = (SELECT s.cle
                                         FROM TBLCONSTRUCTION e
                                              INNER JOIN TBLCOMMANDE s
                                                ON e.clecommande = s.clecommande
                                               AND e.numeroligne = s.numeroligne
                                        WHERE h.CLECOMMANDE = E.CLECOMMANDE
                                          AND h.NUMEROLIGNE = E.NUMEROLIGNE);

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 312
    Par défaut
    Citation Envoyé par Waldar Voir le message
    C'est normal, aucun des deux n'est correct !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE TBLCONSTRUCTION h
       SET h.CLELIGNECOMMANDECLIENT = (SELECT s.cle
                                         FROM TBLCONSTRUCTION e
                                              INNER JOIN TBLCOMMANDE s
                                                ON e.clecommande = s.clecommande
                                               AND e.numeroligne = s.numeroligne
                                        WHERE h.CLECOMMANDE = E.CLECOMMANDE
                                          AND h.NUMEROLIGNE = E.NUMEROLIGNE);
    Bonjour,
    Votre solution me rapporte une erreur : Rapport d'erreur :
    Erreur SQL : ORA-01427: single-row subquery returns more than one row
    01427. 00000 - "single-row subquery returns more than one row"
    *Cause:
    *Action:

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Que donne cette requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT s.cle, count(*)
        FROM TBLCONSTRUCTION e
             INNER JOIN TBLCOMMANDE s
               ON s.clecommande = e.clecommande
              AND s.numeroligne = e.numeroligne
    GROUP BY s.cle
      HAVING count(*) > 1;

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

Discussions similaires

  1. UPDATE avec jointure
    Par warning dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 13/12/2007, 10h35
  2. Requête UPDATE avec jointure
    Par petburn dans le forum SQL
    Réponses: 7
    Dernier message: 30/07/2007, 14h22
  3. [UPDATE] avec jointure sur une requete
    Par userB dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/07/2007, 16h18
  4. Requete update avec jointure d'une requête
    Par bart64 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 28/05/2007, 20h31
  5. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19

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