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 :

Fusionner les données de 2 tables. ORA-30926


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut Fusionner les données de 2 tables. ORA-30926
    Bonjour,

    J'ai un petit souci.

    J'insère des fichiers .txt dans une table TEST_TEMP qui n'a pas de clés primaires.

    J'obtiens des doublons car des quantités différentes.

    Colonnes de mes tables
    code1, code2, code3, code4, code5, code6, date, qte1, qte2

    J'ai une deuxième table identique TEST_DEST qui elle a dés clés primaires (CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, DATE).

    L'idée serait de mettre à jour la table TEST_DEST (sans doublons car il y a des clés primaires):
    - si l'enregistrement n'existe pas => insert
    - si l'enregistrement existe => update (en prenant en compte la dernière valeur qte1 et qte2 obtenue)

    J'ai tenté un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    merge into TEST_DEST a
    using (select * from TEST_TEMP) b
        on  (a.CODE1=b.CODE1 and a.CODE2=b.CODE2 and a.CODE3=b.CODE3 and a.CODE4=b.CODE4 and a.CODE5=b.CODE5 and a.CODE6=b.CODE6 and a.DATE=b.DATE)
        when matched then UPDATE set A.QTE1=B.QTE1,A.QTE2=B.QTE2
        when not matched then insert
        (a.CODE1,a.CODE2,a.CODE3,a.CODE4,a.CODE5,a.CODE6,a.DATE,a.QTE1,a.QTE2)   
       values (b.CODE1,b.CODE2,b.CODE3,b.CODE4,b.CODE5,b.CODE6,b.DATE,b.QTE1,b.QTE2);
    J'obtiens une erreur SQL: ORA-30926 : unable to get a stable set of rows in the source tables.

    Raison: il y a des doublons dans ma table TEST_TEMP mais ils sont nécessaires car je souhaite mettre à jour des quantités.

    Si quelqu'un a une idée....

    Merci d'avance pour votre aide.

    Cordialement

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il manque le code6 dans votre jointure du merge.

    D'ailleurs vous pouvez remplacer USING (SELECT * FROM TEST_TEMP) b par USING TEST_TEMP b.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Pour que le l'UPDATE du MERGE fonctionne, il faut que le SELECT du USING implémente la règle de gestion :
    (en prenant en compte la dernière valeur qte1 et qte2 obtenue)
    Qui j'imagine fait référence à la date max ?
    Or à leur actuelle le simple select * from TEST_TEMP n'y répond pas.

    Regardez du côté de first / last en version agrégée, ou du côté de row_number

  4. #4
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Merci j'ai ajouté le code6. C'est une erreur lorsque j'ai traduit ma requête pour le forum...

    J'ai modifié le using.

    Malheureusement ça ne résout pas mon problème.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Pour que le l'UPDATE du MERGE fonctionne, il faut que le SELECT du USING implémente la règle de gestion :

    Qui j'imagine fait référence à la date max ?
    Or à leur actuelle le simple select * from TEST_TEMP n'y répond pas.

    Regardez du côté de first / last en version agrégée, ou du côté de row_number
    Ok tout s'explique.

    On ne peut pas fier à la date MAX car il se peut que plusieurs fichiers soient envoyés à la même date. Par contre on peut se fier au row number. Je regarde la syntaxe.

    Merci

  6. #6
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Pour que le l'UPDATE du MERGE fonctionne, il faut que le SELECT du USING implémente la règle de gestion :

    Qui j'imagine fait référence à la date max ?
    Or à leur actuelle le simple select * from TEST_TEMP n'y répond pas.

    Regardez du côté de first / last en version agrégée, ou du côté de row_number
    Je ne trouve pas la syntaxe. Pourriez-vous me l'indiquer svp ?

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    en prenant en compte la dernière valeur qte1 et qte2 obtenue
    Pouvez-vous préciser la règle de gestion ? Par un jeu de test (quelques lignes en entrée et le résultat attendu)

  8. #8
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    TEST_TEMP

    code1, code2, code3, code4, code5, code6, date, qte1, qte2
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 50, 51
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 100, 80
    AA10, AA20, AA30, AA40, AA50, AA60, 07/06/2014 150 100



    TEST_DEST

    code1, code2, code3, code4, code5, code6, date, qte1, qte2
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 100, 80
    AA10, AA20, AA30, AA40, AA50, AA60, 07/06/2014 150 100

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Ok et en français ça veut dire max(qte1) et max(qte2) ?
    Ou la ligne qui correspond à max(qte1) ou à max(qte2)?
    ou la ligne plus basse dans le fichier au quel cas vous devez ajouter une séquence à l'insertion des lignes dans la table (une table n'a pas d'ordre).

  10. #10
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Ok et en français ça veut dire max(qte1) et max(qte2) ?
    Ou la ligne qui correspond à max(qte1) ou à max(qte2)?
    ou la ligne plus basse dans le fichier au quel cas vous devez ajouter une séquence à l'insertion des lignes dans la table (une table n'a pas d'ordre).
    On prend la ligne la plus basse. La dernière ligne insérée remplace la précédente.

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ce que skuatamad vous dit ici :
    une table n'a pas d'ordre
    Signifie que :
    code1, code2, code3, code4, code5, code6, date, qte1, qte2
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 50, 51
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 100, 80
    Est strictement identique dans le monde relationnel à :
    code1, code2, code3, code4, code5, code6, date, qte1, qte2
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 100, 80
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 50, 51
    Il n'y a pas de "première ligne" ni de "ligne la plus basse".
    Il faut forcément une règle pour déterminer un classement.
    Le mieux qu'on puisse faire c'est en prendre une des deux, avec une règle abstraite ou non-déterministe (du hasard ou simili hasard si vous préférez).

  12. #12
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Ce que skuatamad vous dit ici :
    Signifie que :
    code1, code2, code3, code4, code5, code6, date, qte1, qte2
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 50, 51
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 100, 80
    Est strictement identique dans le monde relationnel à :
    code1, code2, code3, code4, code5, code6, date, qte1, qte2
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 100, 80
    AA1, AA2, AA3, AA4, AA5, AA6, 06/06/2014, 50, 51
    Il n'y a pas de "première ligne" ni de "ligne la plus basse".
    Il faut forcément une règle pour déterminer un classement.
    Le mieux qu'on puisse faire c'est en prendre une des deux, avec une règle abstraite ou non-déterministe (du hasard ou simili hasard si vous préférez).
    Dans ce cas, autant se fier à la date (même si il y a des jours ou un deuxième fichier pourrait annuler le premier, c'est une cas très particulier qui ne doit pas arriver très souvent).

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    D'accord, essayez comme ceci :
    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
    25
     MERGE INTO TEST_DEST tgt
     USING (
            with SR (CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, DATE, QTE1, QTE2, rn) as
            (
            select CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, DATE, QTE1, QTE2
                 , row_number() over(partition by CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, date order by date desc)
              from TEST_TEMP
            )
            select CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, DATE, QTE1, QTE2
              from SR
             where rn = 1
           ) src
        ON (tgt.CODE1 = src.CODE1
       AND  tgt.CODE2 = src.CODE2
       AND  tgt.CODE3 = src.CODE3
       AND  tgt.CODE4 = src.CODE4
       AND  tgt.CODE5 = src.CODE5
       AND  tgt.CODE6 = src.CODE6
       AND  tgt.DATE  = src.DATE)
      WHEN MATCHED THEN UPDATE
       SET tgt.QTE1   = src.QTE1
         , tgt.QTE2   = src.QTE2
      WHEN NOT MATCHED THEN INSERT
           (tgt.CODE1, tgt.CODE2, tgt.CODE3, tgt.CODE4, tgt.CODE5, tgt.CODE6, tgt.DATE, tgt.QTE1, tgt.QTE2)   
    VALUES (src.CODE1, src.CODE2, src.CODE3, src.CODE4, src.CODE5, src.CODE6, src.DATE, src.QTE1, src.QTE2);

  14. #14
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Merci !

    Erreur SQL: ORA-32033: unsupported column aliasing
    *Cause: column aliasing in WITH clause is not supported yet

  15. #15
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par johnbobby Voir le message
    Erreur SQL: ORA-32033: unsupported column aliasing
    *Cause: column aliasing in WITH clause is not supported yet
    Remplacez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with SR (CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, DATE, QTE1, QTE2, rn) as
            (
            select CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, DATE, QTE1, QTE2
                 , row_number() over(partition by CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, date order by date desc)
              from TEST_TEMP
            )
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with SR as
            (
            select CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, DATE, QTE1, QTE2
                 , row_number() over(partition by CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, date order by date desc) as rn
              from TEST_TEMP
            )

  16. #16
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    erreur sur "date order by date desc"

    Erreur SQL: ORA-00936: missing expression

  17. #17
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    C'est du debug, vous avez dû vous tromper dans la syntaxe :
    http://ora-00936.ora-code.com/

  18. #18
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Normal que le order by soit avant le from ?

  19. #19
    Membre à l'essai
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Autant pour moi c'était bien une erreur de syntaxe. Le champ date s'appelle différemment dans ma table et je ne l'avais pas modifié.

    Je teste et vous fais un retour. Merci.

  20. #20
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par johnbobby Voir le message
    Normal que le order by soit avant le from ?
    Oui, ce n'est pas le tri de la requête, c'est le tri des données uniquement pour cette fonction.

    C'est ce qu'on appelle des fonctions de fenêtrage, ou encore fonctions analytiques.
    Vous pouvez regarder ce tutoriel : http://lalystar.developpez.com/fonctionsAnalytiques/

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [MySQL] Fusionner les données deux tables
    Par jameson dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 29/07/2010, 16h25
  2. Fusionner les données de 2 tables
    Par LyInIa dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 20/02/2009, 07h52
  3. Problème pour lire les donnée d'une table externe
    Par mardoch dans le forum SQL*Loader
    Réponses: 6
    Dernier message: 17/07/2008, 16h41
  4. MySQL Administrator : modifier les données d'une table
    Par Robinounou dans le forum Outils
    Réponses: 4
    Dernier message: 13/07/2005, 17h21
  5. transformer les données d'une table .dbf vers ma BD
    Par djouahra.karim1 dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/11/2004, 09h54

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