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

Langage SQL Discussion :

Requete SQL update filtrée sur 2 tables


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 324
    Points : 40
    Points
    40
    Par défaut Requete SQL update filtrée sur 2 tables
    Bonjour,

    J'ai créé la requête ci-dessous pour mettre à jour le champ COUT_TRANSPORT_APRES_COEFF dans la table HISTORIQUE, avec le coefficient qui se trouve dans la table COEFFICIENT_TRANSPORT.
    Cependant dans le select que je fais, je souhaite ajouter une condition supplémentaire, en disant que je veux récupérer uniquement les clients qui sont en division=02, cette information de division se trouve dans la table CLIENTS.
    Le lien serait à faire entre la table HISTORIQUE et la table CLIENTS pour pouvoir filtrer sur la division 02 via le champ "CLIENT_FACTURE".
    La table COEFFICIENT_TRANSPORT, ne contient que 3 champs : date_debut, date_fin, Coefficient.

    Comment ajouter cette condition supplémentaire sur le division ?

    Merci d'avance pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    UPDATE 
     [Invoice].[HISTORIQUE]
    SET 
     [Invoice].[HISTORIQUE].[COUT_TRANSPORT_APRES_COEFF] = (
     
    	CASE
    		WHEN 
    			 (SELECT
    			  [Invoice].[COEFFICIENT_TRANSPORT].[Coefficient]
    			  FROM
    			  [Invoice].[COEFFICIENT_TRANSPORT]
    			 WHERE
    			  [Invoice].[HISTORIQUE].[DATE_FACTURE] >= [Invoice].[COEFFICIENT_TRANSPORT].[Date_debut]
    			  AND [Invoice].[HISTORIQUE].[DATE_FACTURE] <= [Invoice].[COEFFICIENT_TRANSPORT].[Date_fin])>0 
    			THEN 
    				(SELECT
    				  [Invoice].[COEFFICIENT_TRANSPORT].[Coefficient]
    				  FROM
    				  [Invoice].[COEFFICIENT_TRANSPORT]
    				 WHERE
    				  [Invoice].[HISTORIQUE].[DATE_FACTURE] >= [Invoice].[COEFFICIENT_TRANSPORT].[Date_debut]
    				  AND [Invoice].[HISTORIQUE].[DATE_FACTURE] <= [Invoice].[COEFFICIENT_TRANSPORT].[Date_fin])*[Invoice].[HISTORIQUE].[COUT_TRANSPORT]
    		ELSE
    			[Invoice].[HISTORIQUE].[COUT_TRANSPORT]
    	END
    	)

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Attention, ta requête met à jour TOUTES les lignes de la table HISTORIQUE !
    Si tu utilises Sql Serveur (je ne sais pas ce qu'il en est des autres SGBDs, à vérifier), tu peux faire des jointures dans une requête UPDATE:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    update historique
    set COUT_TRANSPORT_APRES_COEFF = COEFFICIENT_TRANSPORT.Coefficient
    from invoice.historique
    inner join invoice.COEFFICIENT_TRANSPORT
    on...
    inner join invoice.client
    on ...
    where client.division = '02'
    and ...

    Tatayo.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 324
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Oui tout à fait je mets à jour toute la table historique.

    En fait dans la table historique, j'ai un champ COUT_TRANSPORT existant et je veux mettre à jour le champ COUT_TRANSPORT_APRES_COEFF en allant rechercher le coefficient présent dans la table COEFFICIENT_TRANSPORT mais en ajoutant la condition sur la division 02.
    Mais quand ça ne respecte pas cette condition, je veux dire que COUT_TRANSPORT_APRES_COEFF = COUT_TRANSPORT.

    Je ne peux pas faire d'inner join entre les tables COEFFICIENT_TRANSPORT et HISTORIQUE, aucun lien n'existe.



    Merci d'avance

  4. #4
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonsoir,

    J'avoue ne pas tout comprendre.
    Ce que j'ai compris c'est

    1. la volonté de mettre à jour la table historique
    *** quelle drôle d'idée que de vouloir modifier le passé !
    Cette table comporte les colonnes DATE_FACTURE, CLIENT_FACTURE, COUT_TRANSPORT_APRES_COEFF, COUT_TRANSPORT

    2. la table historique peut être jointe à la table client sur la valeur des colonnes CLIENT_FACTURE

    3. la table client nous permet de filtrer where division='02'

    4. ne mettre à jour la colonne COUT_TRANSPORT_APRES_COEFF que si where COUT_TRANSPORT_APRES_COEFF = COUT_TRANSPORT

    5. La table COEFFICIENT_TRANSPORT, contient 3 champs : date_debut, date_fin, Coefficient.
    ** laquelle des 2 dates est exclue de la période applicable, celle de fin ou de début ?


    Si on faisait un select ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select F.*
    From invoice.historique F
       inner join clients C on C.client_facture= F.client_facture
    where C.division='02' and F.COUT_TRANSPORT_APRES_COEFF = F.COUT_TRANSPORT
    Là on devrait avoir les lignes qui intéresse, non ?

    Si c'est Ok, on met ça en CTE pour la lisibilité lorsqu'on ajoute la problématique du coef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ;
    With 
    histo as 
    (Select F.*
    From invoice.historique F
       inner join clients C on C.client_facture= F.client_facture
    where C.division='02' and F.COUT_TRANSPORT_APRES_COEFF = F.COUT_TRANSPORT
    )
     
    select *
    , H.COUT_TRANSPORT*C.Coefficient as F.COUT_TRANSPORT_APRES_COEFF
    from histo H
    inner join COEFFICIENT_TRANSPORT C on H.DATE_FACTURE >= C.date_debut and H.DATE_FACTURE < C.date_fin

    on est bon ?
    Le savoir est une nourriture qui exige des efforts.

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

Discussions similaires

  1. [MySQL] Requetes SQL UPDATE sur deux table.
    Par makamine dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 20/05/2011, 00h52
  2. Requete SQL jointure externe sur plusieurs tables
    Par mattmax dans le forum Développement
    Réponses: 4
    Dernier message: 28/12/2010, 10h07
  3. Requete SQL avec jointure sur trois tables
    Par pit2121 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/05/2008, 23h07
  4. [SQL - Oracle 9i] Requete Sql avec filtre sur critere
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 05/12/2007, 08h45
  5. [SQL Server] Filtré sur une table avant une jointure externe
    Par TangoZoulou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2006, 15h52

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