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

Langage SQL Discussion :

[ORACLE 9] Mise à jour complexe ?


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut [ORACLE 9] Mise à jour complexe ?
    bonjour,

    Au secours, je suis malade.

    Je pense que j'ai de la fièvre. Je suis désolé pour ce message plutôt ... hummm... d'amateur mais je n'arrive pas à resoudre une requête SQL qu'à travers un solution ... hum... disons tiré par les cheveux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE TMP_CLAUDIO
    (ID_SOCIETE VARCHAR2(4),
     ID_SITE    VARCHAR2(4));
     
    INSERT INTO TMP_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocA','SitX');
     
    CREATE TABLE TMP_REF_CLAUDIO
    (ID_SOCIETE  VARCHAR2(4),
     ID_SITE     VARCHAR2(4));
     
    INSERT INTO  TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocB','SitX');
    L'idée est de remplacer la valeur ID_SOCIETE de ma table temporaire TMP_CLAUDIO par la valeur de la table de référence TMP_REF_CLAUDIO

    Je peux facilement faire ça avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE TMP_CLAUDIO upd
    SET ID_SOCIETE = (SELECT distinct rfr.ID_SOCIETE
                        FROM TMP_REF_CLAUDIO rfr
                       WHERE upd.ID_SITE = rfr.ID_SITE
                         AND upd.ID_SOCIETE != rfr.ID_SOCIETE)
    WHERE EXISTS (SELECT 1
                  FROM TMP_REF_CLAUDIO RFR 
                  WHERE RFR.ID_SITE = upd.ID_SITE
    			  AND rfr.ID_SOCIETE != upd.ID_SOCIETE)
    Mais ça se complique DIABLEMENT si j'ai une table de référence pourrie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO  TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocA','SitX');
    INSERT INTO  TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocB','SitX');
    INSERT INTO  TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocC','SitX');
    INSERT INTO  TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocC','SitX');
    INSERT INTO  TMP_REF_CLAUDIO (ID_SOCIETE, ID_SITE) VALUES ('SocC','SitX');
    Pour le même site 'SiteX' j'ai 3 sociétés SocC (3 fois) SocB (2 fois) socA(1 fois)

    J'ai essayé la chose suivante, mais je n'arrive pas trouvé ce qui cloche dans ma requête. Il semble que la référence 'upd' à la table TMP_CLAUDIO se marche pas parce que j'ai 2 select imbriqués.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    UPDATE TMP_CLAUDIO upd
    SET ID_SOCIETE = (SELECT ID_SOCIETE FROM (SELECT rfr.ID_SOCIETE, count(*)
                        FROM TMP_REF_CLAUDIO rfr
                       WHERE upd.ID_SITE = rfr.ID_SITE
                         AND upd.ID_SOCIETE != rfr.ID_SOCIETE
                    GROUP BY rfr.ID_SOCIETE ORDER BY 2 DESC) WHERE ROWNUM = 1)
    WHERE EXISTS (SELECT 1
                  FROM TMP_REF_CLAUDIO RFR 
                  WHERE RFR.ID_SITE = upd.ID_SITE
    			  AND rfr.ID_SOCIETE != upd.ID_SOCIETE)
    Il faudrait donc que je trouve une requête qui me renvoit 'SocC' dans un seul select.

    J'espère avoir été clair (????)

    Claudio

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Points : 15
    Points
    15
    Par défaut Une réponse? pas de réponse.
    J'ajoute une réponse pour remonter dans la pile de message...

    Bon, si le coeur vous en dit, prenez 5 minutes pour lire mon message...

    Sinon, bah je dirais à mon chef qu'on a un problème de compilation qui fait que le buffer est pleine et que, de ce fait, il va falloir passer par 2 tables intermédiaires et que, de ce fait, ... bref, je trouverais bien une excuse.

Discussions similaires

  1. Requête de Mise a jour complexe
    Par devalender dans le forum SQL
    Réponses: 11
    Dernier message: 03/02/2012, 17h50
  2. PL/SQL mise a jour complexe
    Par pierre2008 dans le forum PL/SQL
    Réponses: 2
    Dernier message: 04/10/2011, 18h10
  3. mise a jour de oracle
    Par hokidoki dans le forum Oracle
    Réponses: 1
    Dernier message: 26/12/2007, 10h32
  4. mise a jour table oracle
    Par admcent dans le forum Oracle
    Réponses: 9
    Dernier message: 14/03/2007, 14h32
  5. Réponses: 15
    Dernier message: 30/06/2005, 16h35

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