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 05/12/2011, 12h38   #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 Récupérer valeur de date précédente

Bonjour,

Je dois m'occuper de mettre à jour une table à partir des valeurs d'une deuxième. J'ai donc fait le script qui fonctionne (vous m'aviez aidé pour le faire http://www.developpez.net/forums/d11...mps-vides-0-a/) et malheureusement certains champs sont vides.
Je dois donc les remplir en me servant de la date et en les remplissant avec les mêmes champs que la requête précédente sauf que je dois prendre une valeur de date proche de celle de la table 1.
J'ai pensé faire un test avec la valeur du mois mais ça n'a rien donné de concluant. J'imagine qu'il existe une fonction pour cela mais je n'ai rien trouvé de tel.

Structure de la table :

Citation:
Table 1 :

champ1 champ2 date
1 | 1 | 01/02/2010
2 | 5 | 10/02/2010

Table 2 :

champ1 champ2 date
1 | 1 | 01/02/2010
2 | 5 | 07/02/2010
Comment pourrais-je récupérer la valeur 07/02/2010 de la table 2 sachant que les 2 tables sont reliées par plusieurs champs ?
Le mieux serait de récupérer la valeur précédente au niveau de la date.

De plus, les 2 tables sont dans des schémas différents

En espérant m'être fait comprendre,

merci.
feldi est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 05/12/2011, 13h07   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 649
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 649
Points : 2 647
Points : 2 647
Bonjour,

Après 3 lectures je n'ai toujorus rien compris de ce que vous voullez.

ceci étant dit vu le poste précédant (ca aurai été cool de le linker) je pense qu'il faudrai que vous passiez un peu de temps sur les tuto sql de ce forum.

A défaut revenez ici en précisant :
quelle table voullez-vous updater ?
sur quel critère de sélection ?
Que veut dire "Le mieux serait de récupérer la valeur précédente au niveau de la date" ?


Citation:
De plus, les 2 tables sont dans des schémas différents
Si vous préfixer le nom de vos table par le schéma il n'y aura aucun problème, exemple : mon_schema.ma_table
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 13h48   #3
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 vais essayer d'être plus clair :

j'ai une table 1 que je met à jour avec des informations de table 2.
Certains champs de table 1 sont vides après la mise à jour car les critères de sélection prennent en compte la date, or la date concernée par la ligne vide n'existe pas dans la table 2.
Par contre, j'ai des dates proches dans la table 2 (par exemple, 10/02/2010 dans la table 1 et 07/02/2010 dans la table 2).
Ce qu'il faudrait, c'est substituer la valeur de la date de la table 1 par celle de la table 2 afin que les champs vides de la table 1 soient remplis.

Et la valeur "remplacée" doit être la plus proche possible et si possible du même mois.

Donc ce que j'aimerais, c'est trouver comment faire pour prendre comme date dans la condition de jointure pour la table 1 une date approximative (= celle de la table 2) pour que la jointure table1.date = table2.date soit correcte, afin que l'update concerne toutes les lignes.

J'ai essayé d'être clair dans mes explications.
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h01   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 649
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 649
Points : 2 647
Points : 2 647
Quel est votre requête actuel en fait ?
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h04   #5
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 979
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 979
Points : 1 685
Points : 1 685
Citation:
Envoyé par feldi Voir le message
Donc ce que j'aimerais, c'est trouver comment faire pour prendre comme date dans la condition de jointure pour la table 1 une date approximative (= celle de la table 2) pour que la jointure table1.date = table2.date soit correcte, afin que l'update concerne toutes les lignes.
Il me semble assez dangereux de faire une jointure sur une date !! Que faites-vous lorsque deux dates sont identiques ?

Pouvez-vous nous mettre votre début de requête, un exemple complet (parce qu'ici il n'y a nul part un champ vide) et le résultat attendu.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/12/2011, 14h08   #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
Code :
1
2
3
4
5
6
7
8
9
 
UPDATE <table1>
SET <champAUpdateTable1> = (SELECT DISTINCT <champTable2>
                FROM <table2>
                WHERE <champATable1> = <champATable2>
                    AND <dateTable1> = <dateTable2>
                    AND <champBTable1> = <champBTable2>
                    AND <champCTable1> = <champCTable2>
WHERE <champAUpdateTable1> IS NULL;
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h10   #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
Citation:
Envoyé par lola06 Voir le message
Il me semble assez dangereux de faire une jointure sur une date !! Que faites-vous lorsque deux dates sont identiques ?

Pouvez-vous nous mettre votre début de requête, un exemple complet (parce qu'ici il n'y a nul part un champ vide) et le résultat attendu.
Lorsque les dates sont identiques, je met à jour les colonnes de la table 1avec les données de la table 2.
Le problème se pose quand la date de la table 1 ne se trouve pas dans la table 2.

Pour le résultat, il devrait être sensiblement le même que si la date était la même (champs à récupérer dont des tarifs qui changent selon le mois en gros).
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h13   #8
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 979
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 979
Points : 1 685
Points : 1 685
Citation:
Envoyé par feldi Voir le message
Lorsque les dates sont identiques, je met à jour les colonnes de la table 1avec les données de la table 2.
Le problème se pose quand la date de la table 1 ne se trouve pas dans la table 2.

Pour le résultat, il devrait être sensiblement le même que si la date était la même (champs à récupérer dont des tarifs qui changent selon le mois en gros).
Peut-être pourrais-tu formater tes dates sous la forme 'mm/yyyy' ?
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h16   #9
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Citation:
Envoyé par feldi Voir le message
Donc ce que j'aimerais, c'est trouver comment faire pour prendre comme date dans la condition de jointure pour la table 1 une date approximative (= celle de la table 2) pour que la jointure table1.date = table2.date soit correcte, afin que l'update concerne toutes les lignes.

J'ai essayé d'être clair dans mes explications.
Vous pouvez faire la jointure sur les autres colonnes, et prendre la ligne qui minimise la différence de date. Il faudrait voir la requête initiale pour faire une proposition ... Ainsi que préciser le besoin sur l'association par dates, quand vous dites "la plus proche possible", est-ce que c'est dans l'absolu, ou seulement pour des dates antérieures ? Que faire si ce n'est pas le même mois ? Etc.
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h20   #10
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 649
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 649
Points : 2 647
Points : 2 647
D'après ce que je comprend, votre table1 est une image de la table2.
Pourquoi leur primary key diverge ?
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h28   #11
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
Citation:
Envoyé par lola06 Voir le message
Peut-être pourrais-tu formater tes dates sous la forme 'mm/yyyy' ?
Je suis en train d'essayer ceci :
Code :
1
2
3
 
WHERE <champTable1> = <champTable2>
         AND TO_DATE(<dateTable1>, 'MM/YYYY') = TO_DATE(<dateTable2>, 'MM/YYYY')
et j'obtiens un message d'erreur pour le moment :
Citation:
ORA-01843: ce n'est pas un mois valide
Je continue à travailler dans cette direction.

Citation:
Envoyé par Rei Ichido Voir le message
Vous pouvez faire la jointure sur les autres colonnes, et prendre la ligne qui minimise la différence de date. Il faudrait voir la requête initiale pour faire une proposition ... Ainsi que préciser le besoin sur l'association par dates, quand vous dites "la plus proche possible", est-ce que c'est dans l'absolu, ou seulement pour des dates antérieures ? Que faire si ce n'est pas le même mois ? Etc.
La date doit être dans le même mois, même si on prend les jours postérieurs.
Qu'est ce que tu entends par
Citation:
'la ligne qui minimise la diff de date '
?

Citation:
Envoyé par punkoff Voir le message
D'après ce que je comprend, votre table1 est une image de la table2.
Pourquoi leur primary key diverge ?
Une modif de la structure des informations a fait que la table 2 ne convenait plus. Une table 1 a donc été crée et pour le début on récupère les informations à partir de table 2 ainsi que d'autres endroits. Par contre, certains champs ne sont pas remplis a cause de ce problème de date, je dois donc trouver un moyen de les remplir.
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h32   #12
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 979
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 979
Points : 1 685
Points : 1 685
Citation:
Envoyé par feldi Voir le message
Je suis en train d'essayer ceci :
Code :
1
2
3
 
WHERE <champTable1> = <champTable2>
         AND TO_DATE(<dateTable1>, 'MM/YYYY') = TO_DATE(<dateTable2>, 'MM/YYYY')
Essaye plutôt avec TO_CHAR(<dateTable1>, 'MM/YYYY')
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/12/2011, 14h40   #13
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
Citation:
Envoyé par lola06 Voir le message
Essaye plutôt avec TO_CHAR(<dateTable1>, 'MM/YYYY')
Ah merci, il ne me reste plus que 45 lignes avec des champs vides
Mais j'ai l'impression que ça vient d'autre part pour ce coup.

Merci pour l'aide !
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h43   #14
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 979
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 979
Points : 1 685
Points : 1 685
Vu que tu n'as pas vraiment de règle, ne pourrais-tu pas remplacer la date de la table 1 par la date de la table 2 sans faire de vérification sur la date ?

Ça donnerai :

Code :
1
2
3
4
5
6
7
UPDATE <table1>
SET <champAUpdateTable1> = (SELECT DISTINCT <champTable2>
                FROM <table2>
                WHERE <champATable1> = <champATable2>
                    AND <champBTable1> = <champBTable2>
                    AND <champCTable1> = <champCTable2>
WHERE <champAUpdateTable1> IS NULL;
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h50   #15
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
Citation:
Envoyé par lola06 Voir le message
Vu que tu n'as pas vraiment de règle, ne pourrais-tu pas remplacer la date de la table 1 par la date de la table 2 sans faire de vérification sur la date ?
Non, je suis obligé de faire le test sur la date étant donné qu'il peut y avoir plusieurs même résultat pour le même mois.
Donc ta solution ne fonctionne malheureusement pas (risque d'erreurs :s)

Et c'est pourquoi on m'a conseillé d'utiliser une requête imbriquée qui ramènerait toutes les lignes de la table 2 dont la date est inférieure à celle de la table 1 puis avec une fonction MAX, on récupère la valeur la plus haute (qui correspond donc à la date la plus proche de celle recherchée).

Comment je pourrais faire pour intégrer cette sous-requête à ma requête initiale ?
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h53   #16
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 649
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 649
Points : 2 647
Points : 2 647
bonjour,

utilisez un group by : http://sqlpro.developpez.com/cours/sqlaz/ensembles/
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 15h02   #17
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Tu peux utiliser un MERGE INTO - j'ai essayé de garder les notations, ce qui ne simplifie pas la tache et rend compliqué tout test, mais bon l'idée y est !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
MERGE INTO <table1> USING 
        (
         SELECT <champATable2>, <champBTable2>, <champCTable2>, max(<dateTable2>) AS dateMax, max(<champTable2>) keep (dense_rank first ORDER BY <dateTable1>) AS champ  
           FROM <table2>
          WHERE
          GROUP BY <champATable2>, <champBTable2>, <champCTable2>, 
        ) v
        ON (<champATable1> = v.<champATable2>
            AND <champBTable1> = v.<champBTable2>
            AND <champCTable1> = v.<champCTable2>
            AND TO_CHAR(v.dateMax,'MMYYYY') = TO_CHAR(<dateTable2>,'MMYYYY')
           )
WHEN MATCHED THEN
     UPDATE SET <champAUpdateTable1> = v.champ
EDIT : il faudrait rajouter une condition sur la différence des dates, je suppose (sinon s'il y a une date égale pour le même mois ET une date postérieure, ça updatera avec la date postérieure).
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 16h44   #18
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Est ce que ce SELECT correspond au besoin ?
Code :
1
2
3
4
5
6
7
SELECT t1.champ1, t1.champ2, t1.date AS old_date,
       (SELECT max(t2.date) 
          FROM table2 t2
         WHERE t2.champ1 = t1.champ1
           AND t2.champ2 = t1.champ2
           AND t2.date  <= t1.date) AS new_date
  FROM table1 t1
Si oui le MERGE pourrait s'écrire :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 merge INTO table1 t
 USING (
SELECT t1.champ1, t1.champ2, t1.date AS old_date,
       (SELECT max(t2.date) 
          FROM table2 t2
         WHERE t2.champ1 = t1.champ1
           AND t2.champ2 = t1.champ2
           AND t2.date  <= t1.date) AS new_date
  FROM table1 t1
       ) u 
    ON (t.champ1 = u.champ1 AND t.champ2 = u.champ2 AND t.date = u.old_date)
  when matched then UPDATE
   SET t.date = u.new_date
Par contre je ne suis pas sûr qu'on puisse UPDATE une partie de la jointure du MERGE
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 09h11   #19
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 pense pas que ces merge into fonctionnent bien pour mon cas. Ce n'est pas la date que je veux mettre à jour, mais d'autres champs.
La requête que j'ai pour le moment :

Code :
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
UPDATE invoiceD --alias
    SET invoiceD.csc_euro = (SELECT DISTINCT factures.csc 
    FROM factures --alias
    WHERE invoiceD.invoice_date = 
        (SELECT max(factures.date_facture) AS nouvelleDate
         FROM factures --alias
         WHERE invoiceD.customer_code = factures.code_client 
            AND invoiceD.invoice_code = factures.numero_facture 
            AND invoiceD.product_code = factures.code_article
            AND invoiceD.deliveried_quantity = factures.quantite
            AND invoiceD.invoice_date < factures.date_facture
        )
        AND invoiceD.customer_code = factures.code_client 
        AND invoiceD.invoice_code = factures.numero_facture 
        AND invoiceD.product_code = factures.code_article
        AND invoiceD.deliveried_quantity = factures.quantite
        ),
    invoiceD.prg_euro = (SELECT DISTINCT factures.prg 
    FROM factures
    WHERE invoiceD.invoice_date = 
        (SELECT max(factures.date_facture) AS nouvelleDate
         FROM factures
         WHERE invoiceD.customer_code = factures.code_client 
            AND invoiceD.invoice_code = factures.numero_facture 
            AND invoiceD.product_code = factures.code_article
            AND invoiceD.deliveried_quantity = factures.quantite
            AND invoiceD.invoice_date < factures.date_facture
        )
        AND invoiceD.customer_code = factures.code_client 
        AND invoiceD.invoice_code = factures.numero_facture 
        AND invoiceD.product_code = factures.code_article
        AND invoiceD.deliveried_quantity = factures.quantite),
    invoiceD.prs_ssa_euro = (SELECT DISTINCT factures.prs_ssa 
    FROM factures
    WHERE invoiceD.invoice_date = 
        (SELECT max(factures.date_facture) AS nouvelleDate
         FROM factures
         WHERE invoiceD.customer_code = factures.code_client 
            AND invoiceD.invoice_code = factures.numero_facture 
            AND invoiceD.product_code = factures.code_article
            AND invoiceD.deliveried_quantity = factures.quantite
            AND invoiceD.invoice_date < factures.date_facture
        )
        AND invoiceD.customer_code = factures.code_client 
        AND invoiceD.invoice_code = factures.numero_facture 
        AND invoiceD.product_code = factures.code_article
        AND invoiceD.deliveried_quantity = factures.quantite)
    WHERE (invoiceD.csc_euro IS NULL 
        OR invoiceD.prg_euro IS NULL
        OR invoiceD.prs_ssa_euro IS NULL);
je ne vois pas trop ou utiliser le group by en fait.
Mais ce script ne remplit pas les champs vides de la table invoiceD mais met à jour quand même des lignes. Je vois pas trop la :/
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 09h52   #20
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut,

- Le merge qu'on ta donné met à jour la date mais ce n'est pas son destin... il met à jour ce que tu lui dis de mettre à jour dans la clause WHEN MATCHED
=> Cherche un peu, essaie de comprendre ce truc que tu ne connais pas -- en tous cas visiblement pas très bien : c'est génial et ça t'aidera beaucoup

- Ton script met à jour toutes les lignes qui répondent à :
Code :
1
2
3
4
 
    WHERE (invoiceD.csc_euro IS NULL 
        OR invoiceD.prg_euro IS NULL
        OR invoiceD.prs_ssa_euro IS NULL)
=> Tes sous-requêtes d'update ne servent qu'à déterminer la valeur de mise à jour. S'il n'y en a pas, ça mets à null. Il faut donc mettre les mêmes sous-requête dans ton WHERE ou alors... utiliser MERGE !

- Toutes tes sous-requêtes comportent exactement le même WHERE... et cherchent des max. Cela signifie que pour chaque ligne de facture, tu cherches les max de plusieurs champs. Au lieu de faire trois requête, tu peux faire une requête GROUP BY qui te donne tous ces max.
=> Considère que c'est le résultat de cette requête qui doit mettre à jour ta table, et utilise le MERGE qu'on t'a préconisé.

- Il faut absolument mettre des alias différents pour tes tables, c'est vraiment imbittable comme ça...

- Pour ton besoin de récupérer la csc correspondant à la date la récente, tu peux utiliser la fonction KEEP
Code :
1
2
3
4
5
6
7
8
 
SELECT max(factures.csc) KEEP(DENSE_RANK LAST ORDER BY invoice_date)                        
                            FROM factures --alias
                         WHERE invoiceD.customer_code = factures.code_client 
                            AND invoiceD.invoice_code = factures.numero_facture 
                            AND invoiceD.product_code = factures.code_article
                            AND invoiceD.deliveried_quantity = factures.quantite
                            AND invoiceD.invoice_date < factures.date_facture
- Je sais que c'est difficile, mais sors un peu le nez du guidons, et essaie d'adapter les solutions qu'on te propose (il faudra peut être reprendre la requête de puis le début, mais je t'assure que c'est mieux que de t'acharner comme ça)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann 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 15h27.


 
 
 
 
Partenaires

Hébergement Web