Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/12/2010, 06h26   #1
Membre à l'essai
 
Avatar de Fiona08
 
Inscription : juillet 2008
Messages : 108
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 108
Points : 21
Points : 21
Par défaut Problème de clé primaire double

Salut à tous,

Je fais un select sur plusieurs tables pour charger automatiquement une autre table que je ne nommerais table_finale. Il arrive des jours où la table finale n’est pas chargée parce qu’il ya un problème de clé primaire double(survenue d'une autre table qui nous ai livrée).

J’aurai t-il une possibilité avec le sql de ne charger que les données des clés sans « problème » et pour celles qui ont un problème de clé primaire, de les rejeter et charger la table normalement. Les mauvaises données seront en suite sauvegardé dans un fichier.log ou fichier texte par exemple.

Merci de votre aide
Fiona
Fiona08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 08h23   #2
Invité régulier
 
Mx Victoire
Inscription : octobre 2010
Messages : 45
Détails du profil
Informations personnelles :
Nom : Mx Victoire

Informations forums :
Inscription : octobre 2010
Messages : 45
Points : 9
Points : 9
pour moi je te propose d'ajouter à ta table finale une nouvelle colonne de type auto_increment. j'ai eu le mm problème et c'est de cette manière que j'ai introduis plusieurs données de mm clé.
papypolo22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 10h45   #3
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
Le rejet est à priori incompatible avec la notion de traitement par lot.

- soit tu fais du traitement ligne à ligne et quand une erreur est levée tu rejettes la lignes. C'est ce que font certains ETL (Genio par exemple). Attention aux perfs.

- soit tu fais une table temporaire indexée mais sans contrainte dans laquelle tu travailles pour retirer les lignes en doublon (je crois que l'ETL ODI travaille comme ça)

- soit tu fais un select qui ne prends pas les doublons
Code :
SELECT clé, count(*) FROM source GROUP BY clé HAVING count(*) = 1
et un autre select qui prends les doublons et les mets dans la table de rejet
Code :
SELECT clé, count(*) FROM source GROUP BY clé HAVING count(*) > 1
- soit tu peux tenter un trigger sur ta table finale qui contrôle s'il n'y a pas déjà une ligne avec la même clé primaire
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h01   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 927
Points : 1 927
Citation:
Envoyé par nuke_y Voir le message
Le rejet est à priori incompatible avec la notion de traitement par lot.
Pour éviter le ligne à ligne depuis 10GR2 il y a dml error logging
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2010, 11h19   #5
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
Formidable fonctionnalité, j'adore. Bon donc ça dépend de la version de Fiona8
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h48   #6
Membre à l'essai
 
Avatar de Fiona08
 
Inscription : juillet 2008
Messages : 108
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 108
Points : 21
Points : 21
Salut à tous,

Merci pour vos réponses. Je traivaille pour le moment avec le version 9.2 d’oracle.

Comment faire un traitement ligne à ligne avec sql ? Je n’utilise aucun ETL. Je dois gerer cela avec du code sql ?

@ skuatamad
Merci pour le lien. Je vais lire et voir si je peux aussi l’exploiter pour la version 9.2 d’oracle.

Merci
Fiona
Fiona08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h51   #7
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
Il n'y a besoin d'ETL pour aucune des 4 solutions.

Essaye ma 3e solution, je pense que c'est la plus adaptée.
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 14h17   #8
Membre à l'essai
 
Avatar de Fiona08
 
Inscription : juillet 2008
Messages : 108
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 108
Points : 21
Points : 21
Citation:
Envoyé par nuke_y Voir le message
Le rejet est à priori incompatible avec la notion de traitement par lot.


- soit tu fais un select qui ne prends pas les doublons
Code :
SELECT clé, count(*) FROM source GROUP BY clé HAVING count(*) = 1
et un autre select qui prends les doublons et les mets dans la table de rejet
Code :
SELECT clé, count(*) FROM source GROUP BY clé HAVING count(*) > 1
Salut nuke_y,

quand je fais
Code :
1
2
INSERT INTO table_finale (SELECT count(id_1), id_1, id_ex_2, demp_2, emp_1, date_1, text_1 FROM table_1, table_2 WHERE id_1 = id_2
GROUP BY id_1, id_ex_2, demp_2, emp_1, date_1, text_1having count(id_1) = 1)
cela ne fonctionne pas.

Que dois je faire ou changer?

Merci pour ton aide
Fiona
Fiona08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 14h22   #9
Membre à l'essai
 
Avatar de Fiona08
 
Inscription : juillet 2008
Messages : 108
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 108
Points : 21
Points : 21
j'obtient la faute:ORA-00913: too many values
Fiona08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 15h08   #10
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 927
Points : 1 927
Tu n'as probablement pas de colonne dans table_finale pour recevoir count(id_1). Retire le du select, il n'est pas obligatoire pour faire le GROUP BY HAVING.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 15h09   #11
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
Code :
1
2
3
4
5
6
INSERT INTO table_finale
   (SELECT   id_1, id_ex_2, demp_2, emp_1, date_1, text_1
        FROM table_1, table_2
       WHERE id_1 = id_2
    GROUP BY id_1, id_ex_2, demp_2, emp_1, date_1, text_1
      HAVING COUNT (id_1) = 1)
ou
Code :
1
2
3
4
5
6
7
8
INSERT INTO table_finale
   (SELECT id_1, id_ex_2, demp_2, emp_1, date_1, text_1
      FROM (SELECT   COUNT (id_1), id_1, id_ex_2, demp_2, emp_1, date_1,
                     text_1
                FROM table_1, table_2
               WHERE id_1 = id_2
            GROUP BY id_1, id_ex_2, demp_2, emp_1, date_1, text_1
              HAVING COUNT (id_1) = 1))
EDIT:
tsssss et voila. On met en forme le code et on se fait griller
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 15h32   #12
Membre à l'essai
 
Avatar de Fiona08
 
Inscription : juillet 2008
Messages : 108
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 108
Points : 21
Points : 21
Salut les gars,

merci pour vos sugestions.

@nuke_y
Fonctionne à merveille.
Que veut dire "se faire griller"?

Je vais maintenant essayer de recuperer les valeurs rejétées pour les sauvegarder dans une table_erreur.

Merci
Fiona
Fiona08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 16h37   #13
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 927
Points : 1 927
Citation:
Envoyé par Fiona08 Voir le message
Que veut dire "se faire griller"?
Ca veut dire que j'ai posté 1 minute (affiché mais plutôt 15sec réel) avant lui parce que je n'ai pas repris ton code
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h46.


 
 
 
 
Partenaires

Hébergement Web