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

Développement SQL Server Discussion :

Question sur UPDATE sur deux tables


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Question sur UPDATE sur deux tables
    Bonjour,
    J'ai eu beau chercher sur le forum, je n'ai pas trouver quelque chose qui ressemble à mon petit souci, aussi je me permet de poster un nouveau sujet.

    Voici la situation : je travail sur 2 tables d'un ERP :
    F_ABOENTETE

    les champs qui nous intéressent sont
    AB_No (clé primaire)
    CO_No (valeur a mettre a jour)

    et F_ABOLIGNE

    ici les champs sont
    AB_No (clé primaire strictement identique à celle de F_ABOENTETE),
    CO_No (valeur à mettre à jour),
    AR_Ref (valeur de référence)


    Je sais mettre à jour CO_No dans F_ABOLIGNE en fonction de AR_Ref

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE dbo.F_ABOLIGNE SET CO_No=1 WHERE AR_Ref LIKE '10%'
    Mais par contre je me retrouve coincé dans la table F_ABOENTETE car je n'ai pas AR_Ref.

    Je suis persuadé qu'il y a moyen de récupérer la valeur de AB_No et de s'en servir pour insérer la même valeur que celle présente dans F_ABOLIGNE, mais je n'arrive pas à structurer ma requête ... ça dépasse mes compétences en SQL (acquises sur le tas, je suis Administrateur des ventes, pas ingénieur)

    Merci d'avance de vos lumières et remarques et bonne soirée !

    MisterGinko

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Votre colonne CO_No a une existence soit dans les entêtes, soit dans le détail, mais pas dans les deux.

    J'imagine que dans le détail on peut avoir plusieurs lignes pour une même entête (c'est le principe, sinon on aurait qu'une seule table).

    Imaginez que dans ABOLIGNE pour le même AB_No, j'ai deux CO_No différent.
    Lequel faudrait-il remonter dans ABOENTETE ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Merci pour votre question, c'est un point que je n'avais pas précisé.

    pour résumer, la table F_ABOENTETE est la table des informations d'un abonnement client. D'ou un ID unique avec AB_No.

    La table F_ABOLIGNE corresponds aux lignes présentent dans l'abonnement, donc on peut avoir le même AB_No sur plusieurs lignes. Heureusement, pour un AB_No, on a un CO_No unique.

    Ex :

    F_ABOENTETE

    |AB_No|CO_No|
    |00048|000001|

    F_ABOLIGNE

    |AB_No|CO_No|AR_Ref|
    |00048|000001|10999 |
    |00048|000001|10500 |
    |00049|000002|20200 |

    Mais en effet je comprends la difficulté de faire comprendre que pour un AB_No, on prends la première ligne dans F_ABOLIGNE pour récupérer la valeur de CO_No et l'insérer dans F_ABOENTETE ... j'ai l'impression d'être coincé ...

    j'avais oublié aussi de précisé, je ne peux absolument pas toucher à la structure des tables, ça provient de Sage Ligne 100

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut rep
    Salut,
    Avec SQL Server, il me semble que tu peux utiliser la syntaxe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE T1
    SET T1.tacolonne = T2.unecolonne
    FROM T2
    INNER JOIN ...
    WHERE ...
    ...
    Tu peux je pense utiliser le mot clé FROM en dessous de l'instruction UPDATE pour mettre à jour ta table.

    Tiens nous au courant.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Merci !
    Je ne connais pas encore toutes les subtilités du SQLServer (la plupart des devs chez moi font du MySQL).
    Je teste ça dans la matinée et je vous tiens au courant.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut rép
    De rien

    Tu peux retrouver la syntaxe de l'UPDATE sur SQLServer avec ce lien :
    http://msdn.microsoft.com/fr-fr/library/ms177523.aspx.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    bon j'ai regardé la syntaxe de la commande UPDATE, et je crois avoir trouvé ce qui m’intéresse, mais j'arrive pas à bien construire ma requête ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    USE [MABASE]
    GO
    UPDATE dbo.F_ABOENTETE  ->la table que je veux mettre à jour 
    SET dbo.F_ABOENTETE.CO_No = dbo.F_ABOLIGNE.CO_No ->la valeur du champs CO_No dans F_ABOLIGNE doit être reprise dans le champs CO_No de F_ABOENTETE
    FROM dbo.F_ABOENTETE INNER JOIN dbo.F_ABOLIGNE
    ON (dbo.F_ABOLIGNE.AB_No = dbo.ABOENTETE.AB_No) ->pour chaque valeur du champs AB_No identique dans les deux tables.
    SQL Server Management Studio me renvoi le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Msg*4104, Niveau*16, État*1, Ligne*1
    L'identificateur en plusieurs parties 'dbo.ABOENTETE.AB_No' ne peut pas être lié.
    Je pense qu'il y a une erreur de syntaxe dans ma requête, il faut que je trouve le moyen de dire pour chaque AB_No commun entre les deux table.
    Mais là je sèche un peu ...

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut ça avance
    Bon , j'ai trouvé un vieux message de 2007 qui présente un peu ce que je cherche à faire .

    Je l'ai remi à ma sauce et ça a l'air de fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    USE [MABASE]
    GO
     
    UPDATE dbo.F_ABOENTETE
     
    SET dbo.F_ABOENTETE.CO_No=dbo.F_ABOLIGNE.CO_No
    FROM dbo.F_ABOENTETE INNER JOIN dbo.F_ABOLIGNE ON (dbo.F_ABOENTETE.AB_No=dbo.F_ABOLIGNE.AB_No)
     
    WHERE dbo.F_ABOENTETE.AB_No IS NOT NULL
    Est ce que quelqu'un pourrait jeter un oeil à mon code et me dire ce qu'il en pense ?
    merci d'avance

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut rép
    Citation Envoyé par MisterGinko Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    USE [MABASE]
    GO
     
    UPDATE dbo.F_ABOENTETE
     
    SET dbo.F_ABOENTETE.CO_No=dbo.F_ABOLIGNE.CO_No
    FROM dbo.F_ABOENTETE INNER JOIN dbo.F_ABOLIGNE ON (dbo.F_ABOENTETE.AB_No=dbo.F_ABOLIGNE.AB_No)
     
    WHERE dbo.F_ABOENTETE.AB_No IS NOT NULL
    Re.
    cela à l'air de fonctionner ok mais je ne suis pas sur que tu sois obligé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM dbo.F_ABOENTETE INNER JOIN dbo.F_ABOLIGNE
    .

    Peut-être juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    -- utilise des alias pour les tables pour faciliter la lecture et leur utilisation devant
    -- le nom d'une colonne
    UPDATE dbo.F_ABOENTETE ent
    SET ent.CO_No = ligne.CO_No
    FROM dbo.F_ABOLIGNE ligne
    WHERE ent.AB_No IS NOT NULL
    AND ent.AB_No = ligne.AB_No
    Nous avons effectivement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND ent.AB_No = ligne.AB_No
    qui joint la table à updater avec l'enregistrement de la table dbo.F_ABOLIGNE comme ta jointure avec le INNER JOIN ... ON mais je pense que cela est plus rapide car dans ton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM dbo.F_ABOENTETE INNER JOIN dbo.F_ABOLIGNE
    tu sélectionnes de nouveau la table dbo.F_ABOENTETE. Il faudrait peut-être voir le plan d'exécution pour voir un peu la différence des 2 requêtes. Question de performance si ta table commence à avoir beaucoup d'enregistrements.

    Bonne soirée.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Merci !

    Je ne suis pas vraiment à l'aise avec les alias, mais je comprends l'intérêt. Je n'ai jamais utilisé la commande AND, mais vu que j'ai pas mal d'enregistrement (surtout dans F_ABOLIGNE), ça vaut surement le coup.

    Je vais refaire ma requête dans ce sens et voir si je m'en sort.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Au final, j'avais bien pigé comment ça marchait, car ma requête fonctionne parfaitement Champomy !!!


    En tout cas, exygene, merci beaucoup pour ton intervention j'ai appris beaucoup sur cette situation, et je suis sûr que ça me servira dans le futur !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Liste de sélection sur date entre deux tables
    Par Gazole22 dans le forum QlikView
    Réponses: 3
    Dernier message: 16/07/2013, 12h38
  2. [AC-2003] DCount sur requête de deux tables
    Par Jojo____ dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 27/04/2012, 08h11
  3. update sur plusieurs lignes avec table temporaire
    Par -=mateo=- dans le forum SQL
    Réponses: 3
    Dernier message: 23/12/2010, 14h40
  4. [Access] Update liant deux tables
    Par zapatta dans le forum Langage SQL
    Réponses: 6
    Dernier message: 14/09/2006, 16h17

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