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

PL/SQL Oracle Discussion :

insertion de données dans une table en verifiant une condition


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut insertion de données dans une table en verifiant une condition
    Bonjour ,

    Je suis entrain de développer une requête me permettant de sélectionner des données qui vérifient ma condition dans le filtre .

    En fait , je dois récupérer d'une table une valeur TD (pour un ID) correspondant à l'année N-1.
    Faire une comparaison avec la valeur TD de l'année N (pour un ID)
    Puis inserer dans une autre table si TD(N) >= 40% * TD(N-1)

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO TABLE_CIBLE
    SELECT * FROM TABLE_SOURCE MCT1
    WHERE MCT1.I_TD >= 0.4 * (
    select vam.I_TD from SOURCE vam
    WHERE  MCT1.ID = vam.ID
    AND vam.c_month = to_number(to_char(sysdate,'YYYY'))-1 || '12'
    )
    Voici l'erreur : ORA-01427: single-row subquery returns more than one row
    Je ne vois pas comment je pourrais l'éviter
    J'espère que j'étais clair dans l'explication de mon besoin
    En vous remerciant.

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    Bonjour,

    A priori, la table vam contient plusieurs lignes de TD pour un même ID à une date donnée.
    Est-ce normal ?
    Si non, tes données doivent d'abord être corrigées.
    Si oui, est-ce que la somme de ces TD pourrait servir à ta comparaison ?

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO TABLE_CIBLE
    SELECT * FROM TABLE_SOURCE MCT1
    WHERE MCT1.I_TD >= 0.4 * (
    SELECT sum(vam.I_TD) FROM SOURCE vam
    WHERE  MCT1.ID = vam.ID
    AND vam.c_month = to_number(to_char(sysdate,'YYYY'))-1 || '12'
    GROUP BY vam.ID
    )
    Si tu ne peux pas faire la somme, alors il faut modifier ta sous-requête pour qu'elle ne ramène qu'une seule valeur par interrogation.
    Il faudrait alors plus d'informations sur TD et/ou sur l'organisation de tes tables. (ex : pourquoi deux tables différentes vam et mct1 pour des informations similaires ?)

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut
    Merci pour ta réponse.

    En fait , je dois faire une procédure qui me permette de faire le chargement de ma table cible.
    Dans un premier temps , je charge une table temporaire MCT par les données de l'année en cours c'est à dire :
    ID C_MONTH TD
    1 201001 133
    1 201002 144
    ...
    1 201012 154

    Puis je dois insérer dans ma table cible les données TD(du mois 201012) >= 40%*TD (200912)

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    D'accord alors, je confirme, ton problème vient de vam.
    Pour un couple ID et 200912, tu récupères plusieurs valeurs (or techniquement l'emploi d'une sous-requête et de l'opérateur de comparaison '=' t'oblige à ne récupérer qu'une seule valeur pour ce couple).

    Est ce normal ?
    Si oui, est ce que la somme des TD de ce couple veux dire quelque chose fonctionnellement ?
    Si oui à nouveau, tu peux utiliser la requête avec sum().
    Si non, il va falloir trouver une solution intermédiaire qui ait un sens fonctionnel et qui ne te ramènes que la valeur unique et pertinente.
    Expliques alors quelles sont les valeurs dans vam, stp.

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut
    En fait , afin de faciliter la tache j'insere dans ma table temporaire les(ID , 201012)
    Dans vam(=table temp) les colonnes sont (ID C_MONTH et TD) pour chaque (ID , mois) on a une valeur TD bien définit.

    Je dois faire une comparaison entre la valeur TD(201012) et TD(200912).
    si TD(201012) >= 0.4* TD(200912)
    J'insère dans ma table cible.

    Je ne dois pas faire de sum

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    Citation Envoyé par Chikatilo Voir le message
    En fait , afin de faciliter la tache j'insere dans ma table temporaire les(ID , 201012)

    Je dois faire une comparaison entre la valeur TD(201012) et TD(200912).
    si TD(201012) >= 0.4* TD(200912)
    J'insère dans ma table cible.

    Je ne dois pas faire de sum
    Ok ça j'ai bien compris

    Citation Envoyé par Chikatilo Voir le message
    Dans vam(=table temp) les colonnes sont (ID C_MONTH et TD) pour chaque (ID , mois) on a une valeur TD bien définit.
    Le problème vient de là.
    A priori, au vu de l'erreur, tu n'as pas qu'une seule valeur par (Id, mois).
    Peux tu faire une requête du style suivant (à peaufiner pour ton cas précis), stp ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID, MOIS, count(*) FROM vam
    GROUP BY ID, MOIS
    HAVING Count(*) > 1
    Normalement, cette requete ne devrait te ramener aucune occurrence.
    Par contre si elle ramène qqchose, chaque ligne sera une ligne en erreur par rapport à ta règle annoncée pour chaque (ID , mois) on a une valeur TD bien définit.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/01/2010, 16h24
  2. Insertion de données dans 2 tables différentes.
    Par anthony_rexis dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 24/07/2007, 10h29
  3. Insertion de données dans différentes tables.
    Par zeugzeug dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 21/04/2007, 21h00
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. Réponses: 7
    Dernier message: 12/10/2004, 16h43

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