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

Requêtes et SQL. Discussion :

UPDATE entre 2 tables seulement si le champs de la table source est NON VIDE [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Invité
    Invité(e)
    Par défaut UPDATE entre 2 tables seulement si le champs de la table source est NON VIDE
    Bonjour à tous,

    J’ai besoin de votre aide pour un UPDATE. Je travaille essentiellement en VBA et je nage lorsqu’il s’agit de SQL. Je souhaiterais faire une mise à jour entre deux tables. Jusque-là pas de soucis particuliers. Seulement, certain champs de la table source (donnees) sont vides. Le champ de la table de destination (client) ne doit pas être mis à jour si le champ de la table source est vide. Voici mon code actuelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE client INNER JOIN donnees ON client.ID = donnees.ID SET client.couleur = [donnees].[couleur], client.prix = [donnees].[prix]
    WHERE (((client.ID)=[donnees].[ID]));
    Je ne sais pas où et comment ajouter les conditions (CASE, WHEN, ELSE...). Si le champ "couleur" de la table donnees est vide, ne pas mettre à jour le champ "couleur" de la table client et laisser la valeur actuelle.

    par avance, merci pour votre aide

    Clochete

  2. #2
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Clochete,

    Rien de bien compliqué puisque tu as déjà réalisé la partie la plus complexe de ta requête. Cela dit, tu as mis en place une jointure (INNER JOIN donnees ON client.ID = donnees.ID): il est donc inutile de mettre une condition where (((client.ID)=[donnees].[ID])) car celle ci redonde avec la jointure précédemment écrite.

    En ce qui concerne ton champ couleur de la table donnees, il te faut simplement passer cette condition dans le where (non null et non vide).

    La requête ainsi corrigée :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE Client
    INNER JOIN donnees ON Client.ID = donnees.ID
    SET Client.couleur = [donnees].[couleur],
        Client.prix = [donnees].[prix]
    WHERE (((donnees.couleur) IS NOT NULL
            OR (donnees.couleur)>""));

    N'hésites pas à utiliser l'assistant création de requête pour valider l'écriture de ton code (un clic droit puis mode sql te permets ainsi de visualiser la syntaxe).

    Cordialement

    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Jimbolion et merci pour ton aide.

    C'est avec l'assistant que je construis mes requêtes en SQL.

    Je ne peux pas mettre les conditions dans la clause WHERE car les autres champs ne seraient pas mis à jour.
    En fait, la mise à jour s'effectue sur une vingtaine de champs. Aucune ligne n'est identique. Sur la ligne 1 je peux avoir par exemple les champs 9 et 15 vides et sur la ligne 5 ce sont les champs 12 et 19 qui sont vides. Ce dont j'ai besoin, c'est que pour chaque ligne de ma table source, si un champ est vide, la mise à jour ne s'effectue pas sur ce champ dans la table de destination. Les autres champs non vide devant effectuer la mise à jour.

    Je pense que ça doit s'approcher de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE client INNER JOIN donnees ON client.ID = donnees.ID SET 
    client.couleur = (CASE WHEN [donnees].[couleur] IS NOT NULL THEN [donnees].[couleur] ELSE END),
    client.prix =  (CASE WHEN [donnees].[prix] IS NOT NULL THEN [donnees].[prix] ELSE END);
    Mais la syntaxe n'est pas bonne du tout et il doit manquer un certain nombre d'élément. Le SQL n'est vraiment pas mon fort :-(
    Saurais-tu m'éclairer ?

    Mille mercis
    Clochete

  4. #4
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Clochete,

    Le case when n'existe pas sur Access, tu devras utiliser une condition de type iif afin de retourner soit la valeur de la tables données, soit celle de ta table clients (si null ou vide).

    http://www.developpez.net/forums/d25...equete-access/

    Je te laisse réfléchir sur l'utilisation de cette fonction.

    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  5. #5
    Invité
    Invité(e)
    Par défaut
    Jimbolion,

    Merci pour ces infos. Je vais explorer cette piste. Je crois tenir là ma solution.

    Merci de ton aide

    Clochete

  6. #6
    Invité
    Invité(e)
    Par défaut
    Après réflexion sur cette fonction , voici la bonne syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Tbl1 INNER JOIN Tbl2 ON Tb1.ID = Tbl2.ID SET Tbl1.Champ1 = IIf(IsNull([Tbl2].[Champ1]),[Tbl1].[Champ1],[Tbl2].[Champ2]), Tbl1.Champ2 = IIf(IsNull([Tbl2].[Champ2]),[Tbl1].[Champ2],[Tbl2].[Champ2]);
    Bonne soirée à tous

    Clochete

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

Discussions similaires

  1. [CR 10] Affichage seulement si le champs est non vide
    Par sasseur dans le forum Formules
    Réponses: 1
    Dernier message: 20/08/2009, 13h15
  2. Affichage des lignes d'une table si AU MOINS Champ est NON VIDE
    Par Dr_No dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 09/07/2009, 17h47
  3. Réponses: 4
    Dernier message: 03/07/2008, 15h53
  4. Réponses: 11
    Dernier message: 08/01/2008, 11h36
  5. UPDATER le champ d'une table 1 avec le champ d'une table 2
    Par alain.dissoir dans le forum Oracle
    Réponses: 2
    Dernier message: 08/06/2005, 13h07

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