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 :

[Oracle 10.1] Requête Update avec sous requête et jointure


Sujet :

SQL Oracle

  1. #1
    Membre régulier Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Points : 76
    Points
    76
    Par défaut [Oracle 10.1] Requête Update avec sous requête et jointure
    Bonjour,
    J'ai une table R_TRONCO dont je dois mettre à jour le champ INSEE_co d'après une table R_VOIE. Le modèle est dans le fichier pdf joint.
    Je ne souhaite mettre à jour que les enregistrements sur lesquels j'ai constaté une incohérence.
    J'ai donc la requête suivante :
    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
    34
    35
    UPDATE A_REIMS.R_TRONCO
       SET A_REIMS.R_TRONCO."INSEE_co"   =
              (SELECT R_VOIE.CODCOM
                 FROM    (   (   A_REIMS.R_VOIE_RELATION R_VOIE_RELATION
                              INNER JOIN
                                 A_REIMS.R_TRONCO R_TRONCO
                              ON (R_VOIE_RELATION.GID_A = R_TRONCO.GID))
                          INNER JOIN
                             A_REIMS.R_VOIE R_VOIE
                          ON (R_VOIE.GID = R_VOIE_RELATION.GID_D))
                      INNER JOIN
                         A_REIMS.R_TRONCO_RELATION R_TRONCO_RELATION
                      ON (R_TRONCO_RELATION.GID_A = R_VOIE.GID)
                         AND (R_TRONCO.GID = R_TRONCO_RELATION.GID_D)
                WHERE     (R_TRONCO."INSEE_co" != R_VOIE.CODCOM)
                      AND (R_TRONCO_RELATION.CLASS = 'R_VOIE')
                      AND (R_VOIE_RELATION.CLASS = 'R_TRONCO')
    									AND R_TRONCO.GID != 851)
     WHERE A_REIMS.R_TRONCO.GID IN
                 ( (SELECT R_VOIE.CODCOM
                      FROM    (   (   A_REIMS.R_VOIE_RELATION R_VOIE_RELATION
                                   INNER JOIN
                                      A_REIMS.R_TRONCO R_TRONCO
                                   ON (R_VOIE_RELATION.GID_A = R_TRONCO.GID))
                               INNER JOIN
                                  A_REIMS.R_VOIE R_VOIE
                               ON (R_VOIE.GID = R_VOIE_RELATION.GID_D))
                           INNER JOIN
                              A_REIMS.R_TRONCO_RELATION R_TRONCO_RELATION
                           ON (R_TRONCO_RELATION.GID_A = R_VOIE.GID)
                              AND (R_TRONCO.GID = R_TRONCO_RELATION.GID_D)
                     WHERE     (R_TRONCO."INSEE_co" != R_VOIE.CODCOM)
                           AND (R_TRONCO_RELATION.CLASS = 'R_VOIE')
                           AND (R_VOIE_RELATION.CLASS = 'R_TRONCO')
                           AND R_TRONCO.GID != 851))
    Et là, j'obtiens comme mesage d'erreur :
    Error 25/05/2009 11:20:16 0:00:00.000 Toad for Data Analysts: ORA-01427: single-row subquery returns more than one row 1 57
    Que faire ? Je pensais avoir évacuer le double résultat en ajoutant R_TRONC.GID != 851.
    D'avance, merci,
    Images attachées Images attachées

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Points : 394
    Points
    394
    Par défaut
    Exécuté d'abord ta requête :

    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
    SELECT R_VOIE.CODCOM
                 FROM    (   (   A_REIMS.R_VOIE_RELATION R_VOIE_RELATION
                              INNER JOIN
                                 A_REIMS.R_TRONCO R_TRONCO
                              ON (R_VOIE_RELATION.GID_A = R_TRONCO.GID))
                          INNER JOIN
                             A_REIMS.R_VOIE R_VOIE
                          ON (R_VOIE.GID = R_VOIE_RELATION.GID_D))
                      INNER JOIN
                         A_REIMS.R_TRONCO_RELATION R_TRONCO_RELATION
                      ON (R_TRONCO_RELATION.GID_A = R_VOIE.GID)
                         AND (R_TRONCO.GID = R_TRONCO_RELATION.GID_D)
                WHERE     (R_TRONCO."INSEE_co" != R_VOIE.CODCOM)
                      AND (R_TRONCO_RELATION.CLASS = 'R_VOIE')
                      AND (R_VOIE_RELATION.CLASS = 'R_TRONCO')
    									AND R_TRONCO.GID != 851
    pour voir combien elle te ramène de lignes

  3. #3
    Membre régulier Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Points : 76
    Points
    76
    Par défaut
    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
    SELECT R_VOIE.CODCOM, R_TRONCO.GID
                 FROM    (   (   A_REIMS.R_VOIE_RELATION R_VOIE_RELATION
                              INNER JOIN
                                 A_REIMS.R_TRONCO R_TRONCO
                              ON (R_VOIE_RELATION.GID_A = R_TRONCO.GID))
                          INNER JOIN
                             A_REIMS.R_VOIE R_VOIE
                          ON (R_VOIE.GID = R_VOIE_RELATION.GID_D))
                      INNER JOIN
                         A_REIMS.R_TRONCO_RELATION R_TRONCO_RELATION
                      ON (R_TRONCO_RELATION.GID_A = R_VOIE.GID)
                         AND (R_TRONCO.GID = R_TRONCO_RELATION.GID_D)
                WHERE     (R_TRONCO."INSEE_co" != R_VOIE.CODCOM)
                      AND (R_TRONCO_RELATION.CLASS = 'R_VOIE')
                      AND (R_VOIE_RELATION.CLASS = 'R_TRONCO')
    Me ramène :
    CODCOM GID *
    474 215
    454 244
    172 245
    573 851
    474 851
    454 729
    454 1313
    454 4005
    474 9221
    474 9222
    055 9721
    J'ai donc effectivement un doublon sur l'enregistrement 851. Mais sinon...

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Je pense que ça vient de ton inner join A_REIMS.R_TRONCO. Il faut corréler cette requête à la table que tu update.

    Sinon retirer le GID 851 parce qu'il renvoie 2 lignes ne semble pas très pérenne, à moins que tu ne te serve de cette requête qu'une fois, sinon n'update que ceux qui renvoient une ligne.

    Dernier point tes GID ne semblent pas vraiment IN tes codcom.

    Qu'est ce que ça donne écrit comme ça:

    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
    UPDATE A_REIMS.R_TRONCO r_t
       SET A_REIMS.R_TRONCO."INSEE_co"   =
              (SELECT R_VOIE.CODCOM
                 FROM  A_REIMS.R_VOIE_RELATION R_VOIE_RELATION
                 INNER JOIN A_REIMS.R_VOIE R_VOIE
                          ON R_VOIE.GID = R_VOIE_RELATION.GID_D
                 INNER JOIN A_REIMS.R_TRONCO_RELATION R_TRONCO_RELATION
                      ON (R_TRONCO_RELATION.GID_A = R_VOIE.GID AND R_TRONCO.GID = R_TRONCO_RELATION.GID_D)
                WHERE R_TRONCO."INSEE_co" != R_VOIE.CODCOM
                      AND R_TRONCO_RELATION.CLASS = 'R_VOIE'
                      AND R_VOIE_RELATION.CLASS = 'R_TRONCO'
    		  and R_VOIE_RELATION.GID_A = r_t.GID
    	  )
     WHERE exists (select 1 FROM  A_REIMS.R_VOIE_RELATION R_VOIE_RELATION
                   INNER JOIN A_REIMS.R_VOIE R_VOIE
                          ON R_VOIE.GID = R_VOIE_RELATION.GID_D
                   INNER JOIN A_REIMS.R_TRONCO_RELATION R_TRONCO_RELATION
                      ON (R_TRONCO_RELATION.GID_A = R_VOIE.GID AND R_TRONCO.GID = R_TRONCO_RELATION.GID_D)
                   WHERE R_TRONCO."INSEE_co" != R_VOIE.CODCOM
                      AND R_TRONCO_RELATION.CLASS = 'R_VOIE'
                      AND R_VOIE_RELATION.CLASS = 'R_TRONCO'
    		  and R_VOIE_RELATION.GID_A = r_t.GID
    	      group by R_VOIE.CODCOM
    	      having count(*)=1
    	    )
    PS: je ne trouve pas la surutilisation des ( ) très lisible, en tout cas elle n'est pas nécessaire syntaxiquement.

Discussions similaires

  1. Requète UPDATE avec sous-requète dans la même table.
    Par Selenite dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/03/2009, 15h04
  2. Requete UPDATE avec sous-requète
    Par alaingui dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 27/06/2008, 21h16
  3. UPDATE avec sous requête de sélection avec regroupement
    Par Maxsen dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/03/2008, 11h20
  4. [FB2]Update avec sous requête resultat ?
    Par AuBozon dans le forum SQL
    Réponses: 1
    Dernier message: 29/02/2008, 21h04
  5. Requête Update avec Sous-requête
    Par Yohann_x dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/02/2008, 13h19

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