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 :

ORA-01427: sous-interrogation ramenant un enregistrement de plus d'une ligne


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Par défaut ORA-01427: sous-interrogation ramenant un enregistrement de plus d'une ligne
    Bonjour à tous,

    Par cette requête, je veux mettre à jour deux lignes d'une table avec les données issues d'autres tables. Mais je me bute par cette erreur décrit dans l'objet de ce message. Pouvez-vous m'aider?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Update piece set(p_jour_pro)=(Select (to_date(m_date2_p) - to_date(m_date1_p) +1) from mission
    Where mission.m_numero = '100'),
    (p_montant_pro) =(Select (to_date(m_date2_p) - to_date(m_date1_p) +1) * (ca_frais) from mission, piece, agent, categorie
    Where piece.m_numero = '100'
    and mission.m_numero = '100'
    And piece.m_numero = mission.m_numero
    And piece.p_matricule = agent.a_matricule
    And agent.ca_classe = categorie.ca_classe
    Group by m_date2_p, m_date1_p, ca_frais)
    Where piece.m_numero = '100'
    Merci pour toutes aides.

  2. #2
    Membre éprouvé
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    salut sondo,

    le message est assez clair

    Une de tes sous-requêtes ramène plus d'un enregistrement

    JE dirai que c'est probablement celle qui fait un regroupement de données (la seconde sous-requête qui contient un GROUP BY).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE piece SET(p_jour_pro)=(SELECT (to_date(m_date2_p) - to_date(m_date1_p) +1) FROM mission
    WHERE mission.m_numero = '100'),
    (p_montant_pro) =(SELECT (to_date(m_date2_p) - to_date(m_date1_p) +1) * (ca_frais) FROM mission, piece, agent, categorie
    WHERE piece.m_numero = '100'
    AND mission.m_numero = '100'
    AND piece.m_numero = mission.m_numero
    AND piece.p_matricule = agent.a_matricule
    AND agent.ca_classe = categorie.ca_classe
    GROUP BY m_date2_p, m_date1_p, ca_frais)
    WHERE piece.m_numero = '100'
    Et pour info, tu as des tas de parenthèses qui ne servent à rien dans ta requête. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE piece SET(p_jour_pro) = ...
    A +

  3. #3
    Membre éclairé Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Par défaut
    Bonjour,

    Salut OracleFan,

    Merci pour ton aide. J'ai viré le group by mais c'est toujours la même chose...
    Voilà ce que j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE piece SETp_jour_pro=(SELECT (to_date(m_date2_p) - to_date(m_date1_p) +1) FROM mission
    WHERE mission.m_numero = '100'),
    p_montant_pro =(SELECT (to_date(m_date2_p) - to_date(m_date1_p) +1) * (ca_frais) FROM mission, piece, agent, categorie
    WHERE piece.m_numero = '100'
    AND mission.m_numero = '100'
    AND piece.m_numero = mission.m_numero
    AND piece.p_matricule = agent.a_matricule
    AND agent.ca_classe = categorie.ca_classe)
    WHERE piece.m_numero = '100'

  4. #4
    Membre éclairé Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Par défaut
    Bonjour,

    En fin de compte celui-ci a marcher après des recherches sur le net, j'ai trouvé mon erreur. Merci à vous tous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Update piece set p_jour_pro=(SELECT (to_date(m_date2_p) - to_date(m_date1_p) +1) from mission
    where piece.m_numero = '100'
    and mission.m_numero = piece.m_numero)
    , p_montant_pro = (select (to_date(m_date2_p) - to_date(m_date1_p) +1) * ca_frais FROM categorie, agent, mission
    where piece.m_numero = '
    and agent.a_matricule = piece.p_matricule
    and mission.m_numero = '100'
    and categorie.ca_classe = agent.ca_classe)
    Where piece.m_numero = '100'

  5. #5
    Membre éprouvé
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    Il y a déjà un bon moment de celà, j'ai lu un bouquin. Si mes souvenirs sont bons, c'est un livre préparant à l'examen 1Z0-051 (Oracle 11g SQL Fundamentals) ou 1Z0-047 (Oralce SQL Expert). Le gars disait, écrire une requête SQL qui s'exécute est simple. Par contre, savoir si le résultat attendu est correct, ça c'est une autre histoire.

    Sondo, as-tu réfléchi au pourquoi du GROUP BY dans ta première requête? La sémantique de ta requête est complètement différente avec le GROUP BY que sans ;-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    UPDATE piece 
       SET p_jour_pro = (SELECT (to_date(m_date2_p) - to_date(m_date1_p) +1) FROM mission
                          WHERE piece.m_numero = '100'
                            AND mission.m_numero = piece.m_numero), 
    	   p_montant_pro = (SELECT (to_date(m_date2_p) - to_date(m_date1_p) + 1) * ca_frais 
    	                      FROM categorie, agent, mission
                             WHERE piece.m_numero = 'xxx'
                               and agent.a_matricule = piece.p_matricule
                               and mission.m_numero = '100'
                               and categorie.ca_classe = agent.ca_classe)
    WHERE piece.m_numero = '100'
    Ta requête s'exécute? C'est une chose, mais es-tu sûr que le résultat est celui que tu voudrais?

    De plus, je te conseillerai
    - Quand tu utilise une fonction comme TO_CHAR, TO_DATE,... précise le format de conversion. Au lieu de to_date(m_date2_p) écrit to_date(m_date2_p, 'le-format-de-la-date')
    - Stocke tes dates en DATE dans la base de données, tes nombres en NUMBER etc. Pas tout en (VAR)CHAR! C'est plus simple à gérer dans les requêtes

    A+

  6. #6
    Membre éclairé Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Par défaut
    Salut,

    Merci pour tes remarques. Ma requête me renvoie ce que je veux. Mes dates sont en format date dans la base de donnée.
    Merci pour tes conseils. à bientôt.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/03/2015, 15h01
  2. Réponses: 1
    Dernier message: 13/02/2015, 11h19
  3. Réponses: 6
    Dernier message: 09/12/2014, 08h39
  4. Réponses: 1
    Dernier message: 19/04/2013, 14h14
  5. Réponses: 1
    Dernier message: 20/04/2011, 12h07

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