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 07/12/2011, 16h22   #1
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 308
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 308
Points : 74
Points : 74
Par défaut ORA-30926 : comment contourner

Bonjour,

j'ai un soucis avec ma requête merge.
Cette requête fonctionne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
MERGE INTO invoice t
USING (                            
    SELECT i.product_code,
       max(f.prs_ssa) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) prs_ssa, 
       max(f.csc) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) csc, 
       max(f.prg) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) prg     
    FROM invoice i 
      JOIN factures f 
        ON i.product_code = f.code_article
        AND i.invoice_date < f.date_facture
    WHERE (i.csc_euro IS NULL 
        OR i.prg_euro IS NULL
        OR i.prs_ssa_euro IS NULL)
    GROUP BY i.product_code
       ) s
ON (t.product_code = s.product_code) 
WHEN MATCHED THEN UPDATE SET t.prs_ssa_euro = s.prs_ssa, t.csc_euro = s.csc, t.prg_euro = s.prg
par contre celle ci ne fonctionne pas :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
MERGE INTO invoice t
USING (                            
    SELECT i.product_code, f.quantite, i.quantity,
       max(f.prs_ssa) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) prs_ssa, 
       max(f.csc) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) csc, 
       max(f.prg) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) prg     
    FROM invoice i 
      JOIN factures f 
        ON i.product_code = f.code_article
        AND i.invoice_date < f.date_facture
    WHERE (i.csc_euro IS NULL 
        OR i.prg_euro IS NULL
        OR i.prs_ssa_euro IS NULL)
    GROUP BY i.product_code, f.quantite, i.quantity
       ) s
ON (t.product_code = s.product_code) 
WHEN MATCHED THEN UPDATE SET t.prs_ssa_euro = s.prs_ssa / s.quantite * s.quantity, t.csc_euro = s.csc / s.quantite * s.quantity, t.prg_euro = s.prg / s.quantite * s.quantity
et me renvoie l'erreur ORA-30926.
Le calcul effectué pour l'update est OBLIGATOIRE, mais il peut être déplacé autre part dans la requête si besoin est pour contourner l'erreur.
Le problème est qu'apparemment il existe plusieurs lignes pour la même date et avec le même code produit qui ont des quantités différentes.


Comment feriez vous (sachant que les 2 tables n'ont pas de clé primaires) pour que la requête fonctionne ?
feldi est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 07/12/2011, 16h28   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 653
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 653
Points : 2 655
Points : 2 655
Citation:
Envoyé par punkoff Voir le message
bonjour,


il y a de grande chance que votre clause ON ne permete pas à oracle de définir une relation 1:1 ou 1:0 entre votre table à updater et la sous-requête.

De ce fait il ne sait pas quoi faire car il doit y avoir de multiple gr.Reference_ARCEP possible pour 1 ligne de votre table Suivi_production_FH
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 16h32   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous avez déjà eu la réponse sur l'autre sujet.

L'erreur signifie que pour une valeur de la table invoice, il y ait plusieurs valeurs candidates telles que définies dans votre requête source et votre critère de jointure.

C'est à vous d'affiner vos requêtes, on ne peut pas supposer du contenu de vos tables, vous avez la solution générique il faut l'adapter.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 16h34   #4
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 308
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 308
Points : 74
Points : 74
Et s'il n'y a pas de moyens d'affiner plus la requête ?
Y a t-il une autre solution que le merge ?
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 16h40   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 653
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 653
Points : 2 655
Points : 2 655
Pourquoi ne pouvez-vous pas affiner plus votre requête ?

Le problème n'est pas le merge ici mais l'incohérence de votre nouvelle sous-requête, donc un update classic n'y changera rien.

Pourquoi n'avez vous pas repris la structure max() keep() des autre colonnes pour vos quantités ?

edit : de plus, pourquoi prendre la colonne "quantity" dans votre sous-requête alors que vous l'avez en direct sur votre table invoice ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 19h32   #6
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 308
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 308
Points : 74
Points : 74
Je ne peux pas plus affiner car les autres informations divergent (incohérence des lignes entre les 2 tables et je ne peux pas y remédier).

C'est une bonne idée de faire le max() pour la quantité, je n'y avais pas pensé !
Et oui, je pourrais enlever le quantity que j'ai déjà dans invoice, cette requête me prend tellement la tête que je fais des erreurs bêtes

Merci beaucoup, je testerais dès que je pourrais de nouveau !
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 15h59   #7
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 308
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 308
Points : 74
Points : 74
Tu m'as (presque) sauvé la vie Punkoff, merci !
feldi 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 18h30.


 
 
 
 
Partenaires

Hébergement Web