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 :

Concatener des champs dans une requête UPDATE [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut Concatener des champs dans une requête UPDATE
    Bonjour,

    Je souhaiterai mettre à jour un champs Champs_A1 d'une table Table_A à partir de la concaténation de 3 champs (Champs_B1, Champs_B2, Champs_B3) d'une même table Table_B

    J'ai essayé avec le classique & mais ca ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET [TABLE_A].[Champs_A1] =  [TABLE_B].[Champs_B1] & [TABLE_B].[Champs_B2] & [TABLE_B].[Champs_B3]
    Le résultat: utilisation uniquement de [TABLE_B].[Champs_B1] pour la mise à jour.

    Pour information: tous les champs utilisés (cible et sources) sont au format texte.

    Comment faire?

    D'avance merci.

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Il faudrait la requête complète et plus particulièrement la jointure

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut
    Oups, désolé!

    Donc la requête complète!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE [TABLE_A] INNER JOIN [TABLE_B] ON [TABLE_A].[Champs_A0] = [TABLE_B].[Champs_B0]  SET [TABLE_A].[Champs_A1] =  [TABLE_B].[Champs_B1] & [TABLE_B].[Champs_B2] & [TABLE_B].[Champs_B3];
    Les champs Champs_B0 et Champs_A0 sont au format texte eux-aussi.

    D'avance merci.

  4. #4
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nz([TABLE_B].[Champs_B1],"") & Nz([TABLE_B].[Champs_B2],"") & Nz([TABLE_B].[Champs_B3],"");
    Une requête SELECT affiche bien les bonnes données ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut
    [quote=Tofalu;5147214]Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nz([TABLE_B].[Champs_B1],"") & Nz([TABLE_B].[Champs_B2],"") & Nz([TABLE_B].[Champs_B3],"");
    Ca ne semble pas fonctionner...Même résultat qu'avec ma méthode, de plus les "," sont transformés en ";" lorsque je ré-édite la requête en SQL...

    Citation Envoyé par Tofalu Voir le message
    Une requête SELECT affiche bien les bonnes données ?
    Oui tout à fait.

  6. #6
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Et avec l'opérateur + au lieu de & ?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut
    Ca ne marche pas non plus...

    EDIT: l'opérateur + ne fonctionne pas non plus sur une concaténation effectuée via 1 select simple.

  8. #8
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Tu dépasses pas la limite en nombre de caractères admissibles par le champ ?

    EDIT: l'opérateur + ne fonctionne pas non plus sur une concaténation effectuée via 1 select simple.
    Possible, j'ai pas testé. Le + opère comme le & sur des chaines en VBA mais peut etre pas en SQL

    Les données ne contiennent pas de caractères spéciaux genre retour à la ligne, Chr(0) ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut
    Non, j'avais pensé à cela aussi mais en concaténant les 3 champs, la longueur maximum obtenue est 135 caractères, donc c'est normalement correct pour un champs "texte" (limité à 255 si ma mémoire est bonne)...

    A priori, pas de chr(0) dans ces champs (comment le tester de façon certaine)?

    EDIT:
    J'ai essayé ta solution avec 2 autres tables contenant des données "bidon" (sans caractères spéciaux) et le résultat est le même...

  10. #10
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Bon, chez moi, ce genre de requête fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TABLE1 INNER JOIN TABLE2 ON TABLE1.CHAMP1=TABLE2.CHAMP1 
    SET TABLE1.CHAMP2=TABLE2.CHAMP2 &TABLE2.CHAMP3 &TABLE2.CHAMP4
    Essaye de passer par deux étapes :

    1. Création et sauvegarde d'une requête nommée MaRequete (original hein )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT [TABLE_A].[Champs_A1] AS C1, [TABLE_B].[Champs_B1] & [TABLE_B].[Champs_B2] & [TABLE_B].[Champs_B3] AS C2
    FROM [TABLE_A] INNER JOIN [TABLE_B] ON [TABLE_A].[Champs_A0] = [TABLE_B].[Champs_B0]
    2. Requête UPDATE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE MAREQUETE
    SET C1=C2
    ça va permettre de décortiquer un peu mieux je pense

  11. #11
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    correct pour un champs "texte" (limité à 255 si ma mémoire est bonne)...
    Maximum 255 sauf si spécifié moins. Vérifie quand même

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Tofalu Voir le message
    Bon, chez moi, ce genre de requête fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TABLE1 INNER JOIN TABLE2 ON TABLE1.CHAMP1=TABLE2.CHAMP1 
    SET TABLE1.CHAMP2=TABLE2.CHAMP2 &TABLE2.CHAMP3 &TABLE2.CHAMP4
    Essaye de passer par deux étapes :

    1. Création et sauvegarde d'une requête nommée MaRequete (original hein )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT [TABLE_A].[Champs_A1] AS C1, [TABLE_B].[Champs_B1] & [TABLE_B].[Champs_B2] & [TABLE_B].[Champs_B3] AS C2
    FROM [TABLE_A] INNER JOIN [TABLE_B] ON [TABLE_A].[Champs_A0] = [TABLE_B].[Champs_B0]
    2. Requête UPDATE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE MAREQUETE
    SET C1=C2
    ça va permettre de décortiquer un peu mieux je pense
    J'avais pensé à cette solution dégradée...
    Mais ca ne fonctionne toujours pas (décidément)...

    Par contre, au niveau de la requête SELECT,
    avec la jointure, la concaténation ne se fait pas
    sans la jointure, la concaténation se fait...

    donc, en reprenant ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT [TABLE_B].[Champs_B1] & [TABLE_B].[Champs_B2] & [TABLE_B].[Champs_B3] AS C2
    FROM [TABLE_B]
    fonctionne (concaténation OK)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT [TABLE_A].[Champs_A1] AS C1, [TABLE_B].[Champs_B1] & [TABLE_B].[Champs_B2] & [TABLE_B].[Champs_B3] AS C2
    FROM [TABLE_A] INNER JOIN [TABLE_B] ON [TABLE_A].[Champs_A0] = [TABLE_B].[Champs_B0]
    ne fonctionne pas (concaténation KO)

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut
    Je désespère:

    j'ai essayé de créer une table avec les résultats de la requête du select qui concatène les champs, pour effectuer ensuite la mise à jour à partir de cette table mais rien n'y fait...

  14. #14
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    On avance ! Pas forcément dans le bon sens mais on avance

    Les deux champs à joindre sont bien de même type ? Les tables sont-elles en relation ? Y a t-il des NULL dans les colonnes jointes et non jointes ?

    Quelle est la taille des tables mise en jeu ?

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Tofalu Voir le message
    On avance ! Pas forcément dans le bon sens mais on avance
    J'aime ton optimisme rassurant!

    Citation Envoyé par Tofalu Voir le message
    Les deux champs à joindre sont bien de même type ?
    Oui, si tu parles de TABLE1.CHAMP1 et TABLE2.CHAMP1, ils sont tous deux au format texte (dans lequel il y a des uniquement du numérique, mais je suis obligé de les laisser au format texte).
    Dans les 2 cas, les champs ne sont pas nuls. Par contre, tous les champs TABLE1.CHAMP1 n'ont pas nécessairement une entrée dans TABLE2

    Citation Envoyé par Tofalu Voir le message
    Les tables sont-elles en relation ?
    Non.

    Citation Envoyé par Tofalu Voir le message
    Y a t-il des NULL dans les colonnes jointes et non jointes ?
    Colonnes jointes: non (cf question 1)
    Colonnes non jointes: oui

  16. #16
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    OK, donc la présence de NULL oblige à utiliser NZ.

    MaRequête devient donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
      [TABLE_A].[Champs_A1] AS C1, 
      NZ([TABLE_B].[Champs_B1],"") & 
      Nz([TABLE_B].[Champs_B2],"") & 
      Nz([TABLE_B].[Champs_B3],"") AS C2
    FROM [TABLE_A] 
      INNER JOIN [TABLE_B] 
        ON 
         [TABLE_A].[Champs_A0] = [TABLE_B].[Champs_B0]
    Si ça ne fonctionne toujours pas, poste quelques lignes de tes deux tables

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Tofalu Voir le message
    OK, donc la présence de NULL oblige à utiliser NZ.

    MaRequête devient donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
      [TABLE_A].[Champs_A1] AS C1, 
      NZ([TABLE_B].[Champs_B1],"") & 
      Nz([TABLE_B].[Champs_B2],"") & 
      Nz([TABLE_B].[Champs_B3],"") AS C2
    FROM [TABLE_A] 
      INNER JOIN [TABLE_B] 
        ON 
         [TABLE_A].[Champs_A0] = [TABLE_B].[Champs_B0]
    Si ça ne fonctionne toujours pas, poste quelques lignes de tes deux tables
    C'est bon ca marche nickel! J'ai compacté la base entre temps (je ne sais pas si ca a aidé).



    Merci infiniment Tofalu et excellente fin de journée!

    (je passe en résolu, bien évidemment )

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

Discussions similaires

  1. [AC-2010] Variabilité des champs dans une requête TCD
    Par Deustalos dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/06/2013, 13h05
  2. Comparer des champs dans une requête
    Par khelilo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/02/2013, 11h32
  3. Récupérer les noms des champs dans une requête
    Par Nerziel dans le forum Général Python
    Réponses: 1
    Dernier message: 14/09/2009, 11h29
  4. Réponses: 8
    Dernier message: 23/03/2007, 01h14
  5. Réponses: 5
    Dernier message: 28/12/2006, 15h41

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