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

Oracle Discussion :

ORA-01427: single-row subquery returns more than one row


Sujet :

Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 87
    Par défaut ORA-01427: single-row subquery returns more than one row
    Bonjour,

    Ce n'est pas un sujet nouveau vous direz. C'est vrai. Mais je n'arrive pas à trouver de solution à mon problème.

    J'essaye de faire un update comme ci-bas et je rencontre l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-01427: single-row subquery returns more than one row
    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
    UPDATE TableA ta
    SET ta.DATE=(SELECT DISTINCT te.date   
        FROM  TableB tb,
              TableC tc,
              TableD td,
              TableE te,
              TableF tf
        WHERE ta.CYCLE = to_date('2011/04/09','yyyy/mm/dd hh24:mi:ss')
          AND te.tbll IN (32030,32029)
          AND tb.compte = tc.compte
          AND te.acompte = td.fact
          AND te.code = tf.code )
    WHERE EXISTS 
       (SELECT 1  
        FROM  TableB tb,
              TableC tc,
              TableD td,
              TableE te,
              TableF tf
        WHERE ta.CYCLE = to_date('2011/04/09','yyyy/mm/dd hh24:mi:ss')         
          AND te.tbll IN (32030,32029)
          AND tb.compte = tc.compte
          AND te.acompte = td.fact
          AND te.code = tf.code );
    En effet, le select me retourne 4 lignes. Je me demande de quelle autre façon je pourrais procéder.
    D'ailleurs si quelqu'un sait s'il est possible de simplifier cette requête, je suis preneur.

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Decon Voir le message
    En effet, le select me retourne 4 lignes. Je me demande de quelle autre façon je pourrais procéder.
    Comment nous serions plus à même de déterminer LA date à choisir parmi les quatre ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 87
    Par défaut
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    Comment nous serions plus à même de déterminer LA date à choisir parmi les quatre ?
    Si j'avais réponse à ta question, je n'aurai certainement pas poser la mienne!

    Ma question était de savoir comment je pouvais contourner ce problème.

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    N'y a t-il pas un problème de jointure dans la requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT te.date   
        FROM  TableB tb,
              TableC tc,
              TableD td,
              TableE te,
              TableF tf
        WHERE ta.CYCLE = to_date('2011/04/09','yyyy/mm/dd hh24:mi:ss')
          AND te.tbll IN (32030,32029)
          AND tb.compte = tc.compte
          AND te.acompte = td.fact
          AND te.code = tf.code )
    tb est joint à tc
    te est joint à td et tf

    Quid de la relation entre les deux groupes de tables ?

    Si ce n'est pas ça : Min, Max, Jointures supplémentaires..?

    EDIT : Ta solution est de n'obtenir qu'un seul enregistrement mais nous ne pouvons pas déterminer de règle pour toi pour obtenir un tel résultat

    Tu as une colonne de table et quatre résultats possibles... lequel est le plus probant ?? Nous n'en n'avons pas la réponse

  5. #5
    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
    Pour contourner le problème, ne mettre à jour que quand il n'y a qu'une seule date
    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
    UPDATE TableA ta
    SET ta.DATE=(SELECT DISTINCT te.date   
        FROM  TableB tb, TableC tc, TableD td, TableE te, TableF tf
        WHERE ta.CYCLE = to_date('2011/04/09','yyyy/mm/dd hh24:mi:ss')
          AND te.tbll IN (32030,32029)
          AND tb.compte = tc.compte
          AND te.acompte = td.fact
          AND te.code = tf.code )
    WHERE 1 =   (SELECT count(distinct te.date)  
        FROM  TableB tb, TableC tc, TableD td, TableE te, TableF tf
        WHERE ta.CYCLE = to_date('2011/04/09','yyyy/mm/dd hh24:mi:ss')         
          AND te.tbll IN (32030,32029)
          AND tb.compte = tc.compte
          AND te.acompte = td.fact
          AND te.code = tf.code );

  6. #6
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    Bonjour,

    tu peux sinon faire un pl/sql

    avec un curseur, tu boucles dessus pour tes updates comme cela tu n'auras pas d'erreur mais faut-il que tu dois updater les 4 lignes

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 87
    Par défaut
    Merci pour vos réponses.

    En ce qui concerne les problèmes de jointure, c'est normal. J'ai enlevé dans le message certaines conditions, histoire de vous montrer juste à quoi ça ressemble.

    McM, j'essaye ta méthode pour voir ce que ça donne; sinon je pense que je serai obligé de faire du pl/sql.

    Je regarde tout ça de près et je vous tiens informés.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 87
    Par défaut
    La solution proposée par McM ne fonctionne pas.

    Peut être qu'en vous montrant le résultat de la requête suivante vous comprendrez mieux ce que je veux faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT te.date , ta.DATE , te.compte  
        FROM  TableB tb,
              TableC tc,
              TableD td,
              TableE te,
              TableF tf
        WHERE ta.CYCLE = to_date('2011/04/09','yyyy/mm/dd hh24:mi:ss')
          AND te.tbll IN (32030,32029)
          AND tb.compte = tc.compte
          AND te.acompte = td.fact
          AND te.code = tf.code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    te.date                 ta.DATE                 tb.compte
    10/12/11 23:59:00	26/03/12 13:31:29	470
    26/03/12 13:59:44	26/03/12 13:31:29	548
    26/03/12 13:59:44	26/03/12 13:31:29	540
    26/03/12 13:59:44	26/03/12 13:31:29	440
    20/09/11 11:18:36	26/03/12 13:31:29	515
    26/03/12 13:59:44	26/03/12 13:31:29	121934
    26/03/12 13:59:44	26/03/12 13:31:29	85702
    20/09/11 11:18:36	26/03/12 13:31:29	581
    10/12/11 23:59:00	26/03/12 13:31:29	676
    Et ce que je veux faire c'est pour chaque ligne, faire ta.DATE=te.date.

  9. #9
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    Quelle est ta clé de jointure entre TableA ta et les autres tables?

    car dans ton instruction exists tu ne fais aucune jointure, regarde la 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
    17
    18
    19
    20
    21
    22
    23
    24
    UPDATE TableA ta
    SET ta.DATE=(SELECT DISTINCT te.date   
        FROM  TableB tb,
              TableC tc,
              TableD td,
              TableE te,
              TableF tf
        WHERE te.tbll IN (32030,32029)
          AND tb.compte = tc.compte
          AND te.acompte = td.fact
          AND te.code = tf.code )
    WHERE EXISTS 
       (SELECT 1  
        FROM  TableB tb,
              TableC tc,
              TableD td,
              TableE te,
              TableF tf
        WHERE ta.COLONNE = TableXXX.COLONNE
          AND te.tbll IN (32030,32029)
          AND tb.compte = tc.compte
          AND te.acompte = td.fact
          AND te.code = tf.code )
    and ta.CYCLE = to_date('2011/04/09','yyyy/mm/dd hh24:mi:ss')         ;
    En tout cas si ton résultat te ramène plus d'une ligne et que tu veux quand même updater toutes ces lignes, tu es obligé de passer par un PL/SQL

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 87
    Par défaut
    Merci à tous.

  11. #11
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    Bonjour,

    tu as mis résolue mais tu ne nous as pas dit quelle solution tu as pris?

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/02/2008, 10h07
  2. Réponses: 14
    Dernier message: 15/11/2007, 10h22
  3. Réponses: 4
    Dernier message: 25/01/2007, 15h02
  4. Réponses: 3
    Dernier message: 08/12/2006, 17h28
  5. ORA-01427: single-row subquery returns more than one row
    Par hadid dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/10/2006, 15h35

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