{SQL Server} mise a jour avec deux tables

commandeurd -  
 fiu -
Bonjour,

je voudrais mettre à jours mes fiches articles (prix achat) avec 2 tables
sur la dernier date entrée (sous-linux)

table1 = article
champ = nom, code , prix_achat

table2 = liste des entrees des article
champ = code , prix_achat, qte , date entree

table3 = liste des entrees des articles grossiste
champ = code , prix_achat, qte , date entree.

exemple :

table1
stylo , 123456 , 15€
piles , 123460 , 2€
radio , 123401 ,3€

table2
123456 , 13€ , 24 , 24/10/2009
123460 , 11€ , 4 , 23/10/2009
123456 , 11€ , 24 , 22/10/2009

table3
123456 , 14€ , 12 , 24/11/2009
123401 , 20€ , 24 , 20/10/2009

Resulta finale apres requette:

table1
stylo , 123456 , 14€
piles , 123460 , 11€
radio , 123401 ,20€

Pouvez-vous m'aide?Je vois pas trop comment faire avec 2 tables
Merci.
__________________
Configuration: linux sql

3 réponses

  1. fiu
     
    Salut

    À moins de disposer de trigger dans ta base, tu dois passer 2 requêtes pour ta mise à jour : la première pour table2 ou table3 et la seconde pour table1.
    0
  2. commandeurd
     
    oui , je c'est tres bien, mais je vois pas comment faire avec deux tables, en plus ou mettre max (date entree)
    Merci de guide dans ma recheche
    0
  3. fiu
     
    Salut,

    Allons-y progressivement.
    1. l'intégralité des entrées c'est
    select code, prix_achat, date_entree from table2
    union
    select code, prix_achat, date_entree from table3

    2. pour obtenir les dernière_date_entree par code, on parcourt l'intégralité des entrées en ne conservant que la date max.
    select code, max(date_entree) derniere_date_entree
    from (l'intégralité des entrées)
    group by code

    3. pour obtenir le dernier prix d'achat par code, on parcourt l'intégralité des entrées en ne gardant que les lignes où (code, date_entree) appartient à derniere_date_entree par code. Des lignes conservées, on récupère le prix :
    select code, prix_achat
    from (l'intégralité des entrées) t1
    where (t1.code, t1.date_entree) in (derniere_date_entree par code)


    maintenant, on remplace nos paraphrases par du sql valide
    2=>
    select code, max(date_entree) derniere_date_entree
    from (select code, prix_achat, date_entree from table2
    union
    select code, prix_achat, date_entree from table3)
    group by code

    3=>
    select code, prix_achat
    from (select code, prix_achat, date_entree from table2
          union
          select code, prix_achat, date_entree from table3) t1
    where (t1.code, t1.date_entree) in (
          select code, max(date_entree) derniere_date_entree
          from (select code, prix_achat, date_entree from table2
                union
                select code, prix_achat, date_entree from table3)
          group by code)

    Voilà ! tu as maintenant un joli guide (code, dernier_prix_achat) avec lequel tu vas pouvoir mettre table1 à jour.
    Je te laisse réviser la "Mise à jour d'une table depuis une autre table". La théorie voudrait que cette ultime mise à jour se fasse en se basant sur le guide ci-dessus. Mais comme ça a l'air très gourmand en mémoire, je suppose qu'il vaudra mieux stocker ce guide dans une table temporaire et faire ta mise à jour de table1 d'après cette table temporaire
    0