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 :

Update avec sous requête


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2006
    Messages : 61
    Par défaut Update avec sous requête
    Bonjour à tous,

    Voici mon problème :
    je désire mettre à jour une colonne d'une table à l'aide d'une seule requête, chaque champs aura une valeur différentes selon le critère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE T
    SET Macolonne = 
    ( SELECT C 
      FROM S WHERE T.ref=S.ref
    )
    Première question : est-ce possible ? (j'obtiens une erreur ORA-1427 , la requête renvoie plus d'une ligne)
    2ème question : si oui, comment ?

    Comme j'ai plusieurs milliers de lignes je voulais procédé par une requête comme ci-dessus plutôt que de générer un script avec une requête pour chacune de mes 'ref'. J'ai trouvé ce modèle sur http://www.developpez.net/forums/d56.../update-masse/ mais je n'ai pas tout compris a priori.

    Merci pour votre aide !

  2. #2
    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 !

    Le message raison a certainement raison : ta sous-requête renvoie plusieurs lignes pour une ref donnée... et du coup la question est : quelle valeur C utiliser pour faire l'UPDATE ?

    Une fois que tu aurais la réponse, tu pourras adapter pour prendre soit la plus grande valeur, soit identifier de manière unique la ligne de la table S à utiliser pour faire l'UPDATE.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2006
    Messages : 61
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut !

    Le message raison a certainement raison : ta sous-requête renvoie plusieurs lignes pour une ref donnée... et du coup la question est : quelle valeur C utiliser pour faire l'UPDATE ?

    Une fois que tu aurais la réponse, tu pourras adapter pour prendre soit la plus grande valeur, soit identifier de manière unique la ligne de la table S à utiliser pour faire l'UPDATE.
    Bonjour PACMANN,
    Merci pour cette réponse. Je vais essayé d'être plus explicite (comme cela je comprendrai peut être mieux moi aussi )
    Bref: J'aimerai que la requête puisse mettre à jour le champ T.Macolonne avec la valeur S.C pour chaque T.ref=S.ref soit :

    S.ref S.C
    1 blabla1
    2 blabla2
    3 blabla3

    Du coup T.Macolonne prendrai les valeurs respectives.
    Suis-je plus clair ?

  4. #4
    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 bien ce que j'avais compris...
    Mais si Oracle te dit que ça renvoie plusieurs lignes, c'est que c'est vrai !

    Ca veut dire en gros que tu as :
    S.ref S.C
    1 blabla1
    1 blabla11
    1 blabla111
    2 blabla2
    3 blabla3

    Et donc quand tu veux faire l'UPDATE, il en sait pas lequel prendre.

    Fais la requête suivante pour le vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT ref, count(*)
    FROM T 
      JOIN S ON t.ref = s.ref
    GROUP BY t.ref
    HAVING COUNT(*) > 1
    => et tu verras les références qui ont plusieurs lignes dans S...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 23
    Par défaut
    Bonjour

    J'ai une question.

    En fait j'ai créé une table "users" sur oracleXE. Ds cette table, j'ai un champs login (varchar2) qui est la clé primaire. Je reussis à remplir ma table avec Java/JDBC sans erreurs mais qd je consulte ma table via oracle pr verifier, je remarque que le login deviens un entier qui s'autoincremente au fur et mesure du remplissage de la table alors ka la base j'envoie un String ki devrait etre converti en varchar2 au moment de l'insertion.
    Pour les autre champs "pass, profession ..." ca marche bien . C juste le champs login (clé primaire) qui se stocke sous forme d'ID.

    Merci les amis pr votre aide.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2006
    Messages : 61
    Par défaut
    Merci PACMANN,

    J'ai effectivement plein de lignes qui posent problème ! (quelques centaines pour l'histoire) Merci pour cette explication très clair, je vais corriger ma source et te tiens informé.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2006
    Messages : 61
    Par défaut
    Citation Envoyé par pacmann Voir le message
    C'est bien ce que j'avais compris...
    Mais si Oracle te dit que ça renvoie plusieurs lignes, c'est que c'est vrai !

    Ca veut dire en gros que tu as :
    S.ref S.C
    1 blabla1
    1 blabla11
    1 blabla111
    2 blabla2
    3 blabla3

    Et donc quand tu veux faire l'UPDATE, il en sait pas lequel prendre.

    Fais la requête suivante pour le vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT ref, count(*)
    FROM T 
      JOIN S ON t.ref = s.ref
    GROUP BY t.ref
    HAVING COUNT(*) > 1
    => et tu verras les références qui ont plusieurs lignes dans S...
    Ca fonctionne, encore merci !

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

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