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 :

Concaténation dans jointure


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut Concaténation dans jointure
    Bonjour je cherche à concaténer sur un champ lors de la jointure mais celle-ci ne passe pas et je n'ai jamais aucune donnée dans les champs liée

    Pour l'exemple :

    voila en ce qui concerne le code en SQL sous access 2010 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT *
    FROM 
    ((( A LEFT JOIN B ON A.1 = B.2) LEFT JOIN C ON A.3 = C.3
    )LEFT JOIN E ON A.3 = E.4) LEFT JOIN (D LEFT JOIN E ON D.5 = E.6
    ) ON C.7 = '0' & D.8
    WHERE (((B.9)='19') AND ((B.10)='0') AND ((B.11)='XFI' Or (B.11)='' Or (B.11) Is Null))

    je tente de faire une concaténation sur ' ON C.7 = '0' & D.8 ' mais elle n'est pas prise en compte

    comment procéder car la requête fonctionne mais la concaténation ne fonctionne pas ... ?

    merci d'avance

  2. #2
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 612
    Points
    58 612
    Billets dans le blog
    11
    Par défaut
    Tu ne peux pas concaténer dans un lien. Tu dois pour cela mettre ta liaison dans le where.
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Chercheuse Sciences humaines
    Inscrit en
    Juillet 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheuse Sciences humaines

    Informations forums :
    Inscription : Juillet 2014
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    ça m'intéresse ! J'ai exactement le même problème.
    Voici le code SQL de ma concaténation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TAB_SITE.N°, TAB_FAIT_FUN.REF_SITE, TAB_SITE.ID_SITE, TAB_FAIT_FUN.N°SEP, TAB_FAIT_FUN.ID_FAIT
    FROM TAB_SITE INNER JOIN TAB_FAIT_FUN ON TAB_SITE.N°=TAB_FAIT_FUN.REF_SITE
    WHERE (((TAB_FAIT_FUN.ID_FAIT)=[TAB_SITE]![ID_SITE] & [ - ] & [TAB_FAIT_FUN]![N°SEP]));
    Autrement dit je voudrais avoir un champ qui associe l'id de la table mère et de la table fille. D'aucuns me diront que ça ne sert à rien à part alourdir ma table mais j'en ai besoin pour retrouver mes petits...

    NB : l'ID n'est pas l'identifiant véritable dont je me sers dans les relations, c'est un numéro alphanumérique que je rentre manuellement :
    ID_SITE : abbrégé du nom de Site
    ID_FAIT : fait archéologique identifié sur le site
    Si je compare les faits de sites différents dans un traitement stat, j'ai besoin de savoir d'où ils viennent ! (un peu comme un nom de famille dans un arbre généalogique )

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Chercheuse Sciences humaines
    Inscrit en
    Juillet 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheuse Sciences humaines

    Informations forums :
    Inscription : Juillet 2014
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    ERRATUM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TAB_SITE.ID_SITE, TAB_FAIT_FUN.N°SEP, TAB_FAIT_FUN.ID_FAIT
    FROM TAB_SITE INNER JOIN TAB_FAIT_FUN ON TAB_SITE.N° = TAB_FAIT_FUN.REF_SITE
    WHERE (((TAB_FAIT_FUN.ID_FAIT)=[TAB_SITE]![ID_SITE] & "-" & [TAB_FAIT_FUN]![N°SEP]));
    Il y avait une erreur dans l'expression, et j'ai modifié le code...
    MAIS ça ne fonctionne toujours pas ! :-(

  5. #5
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Hello,

    je ne comprends pas votre soucis avec les jointures comprenant des concaténations...

    La requête suivante marche fort bien :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT T1.A, T1.B, T1.C, T2.A, T2.B, T2.C
    FROM T1 INNER JOIN T2 ON T1.A = 'a' & T2.A;


    Loutine, essaie de garder une cohérence dans ta syntaxe de requête, soit tu gardes un . entre la table et le champ, soit un !, mais évite dans la mesure du possible de marier les deux dans une seule requête =)
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut
    merci

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Chercheuse Sciences humaines
    Inscrit en
    Juillet 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheuse Sciences humaines

    Informations forums :
    Inscription : Juillet 2014
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    J'ai dû m'éloigner quelques temps de ma base mais y reviens avec acharnement !
    Merci jpcheck pour tes conseils... malheureusement je n'y arrive toujours pas.

    Voilà le code mis au propre (c'est effectivement mieux avec la même écriture ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TAB_SITE.ID_SITE, TAB_FAIT_FUN.NUM_SEP, TAB_FAIT_FUN.ID_FAIT 
    FROM TAB_SITE INNER JOIN TAB_FAIT_FUN 
    ON TAB_FAIT_FUN.ID_FAIT = TAB_SITE.ID_SITE & "-" & TAB_FAIT_FUN.NUM_SEP;
    En réalité je me demande si c'est réellement la bonne fonction. Il s'agit de concaténer les champs de deux tables liées, a priori ça semble simplissime mais bon...
    Comme mentionné plus haut il me faut un ID_FAIT qui rassemble l'identifiant du site (ID_SITE) et le numéro de la sépulture donnée sur le terrain (NUM_SEP). L'ID_FAIT est comme un n° d'inventaire qui me servira à comparer des sépultures provenant de plusieurs sites...

    Par la suite j'aurai besoin de créer d'autres concaténations du même genre :
    ID_USF = ID_SITE "-" NUM_SEP "-" NUM_USF (soit ID_FAIT "-" NUM_USF) ;
    ID_EMR = ID_USF "-" NUM_EMR


    Merci infiniment pour votre aide !

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Salut,

    ce qui me gène c'est qu'au lieu d'avoir dans ta jointure
    une table d'un côté, une table de l'autre
    tu as
    une table des deux côtés...


    Quitte à faire avec les deux champs d'un côté vs un champs de l'autre autant faire du
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    ON replace(TAB_FAIT_FUN.ID_FAIT,TAB_SITE.ID_SITE,"")= "-" & TAB_FAIT_FUN.NUM_SEP;
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Chercheuse Sciences humaines
    Inscrit en
    Juillet 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheuse Sciences humaines

    Informations forums :
    Inscription : Juillet 2014
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par jpcheck Voir le message
    Salut,
    ce qui me gène c'est qu'au lieu d'avoir dans ta jointure
    une table d'un côté, une table de l'autre
    tu as
    une table des deux côtés...
    Autant pour moi, j'avais mal compris ta remarque précédente... je suis pas encore hyper au point sur le code, désolée !

    Ma jointure est en fait la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TAB_SITE INNER JOIN TAB_FAIT_FUN ON TAB_SITE.N° = TAB_FAIT_FUN.REF_SITE
    Ce que je veux c'est une concaténation comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TAB_FAIT_FUN.ID_FAIT = TAB_SITE.ID_SITE & "-" & TAB_FAIT_FUN.NUM_SEP
    J'ai essayé moult possibilités mais je n'y parviens pas !

  10. #10
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Si c'est vraiment cette combinaison là, tu peux le faire dans la partie WHERE au lieu de vouloir à tout prix la mettre en jointure
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Chercheuse Sciences humaines
    Inscrit en
    Juillet 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheuse Sciences humaines

    Informations forums :
    Inscription : Juillet 2014
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Du coup mon code du 16/08 n'était pas si mal ? Juste pas très propre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT TAB_SITE.ID_SITE, TAB_FAIT_FUN.NUM_SEP, TAB_FAIT_FUN.ID_FAIT
    FROM TAB_SITE INNER JOIN TAB_FAIT_FUN ON TAB_SITE.N° = TAB_FAIT_FUN.REF_SITE
    WHERE ((TAB_FAIT_FUN.ID_FAIT = TAB_SITE.ID_SITE & "-" & TAB_FAIT_FUN.N°SEP));
    Problème :
    Si je rentre le code directement dans Source Contrôle ou dans Critère de champ de requête, Access m'affiche un msg d'erreur : "Cette expression comporte une sous-requête erronée. Placez la sous-requête entre parenthèses".
    Je l'ai donc rentré dans une requête incluant les 2 tables, dans "Définition des données". Access a compris (cf. image REQ_ID_FAIT).
    Par contre le champ de mon formulaire ne comprend pas (cf. les 2 images FORM_FAIT_creation et FORM_FAIT_utilisation)...

    Que faire ?
    Images attachées Images attachées    

  12. #12
    Nouveau membre du Club
    Femme Profil pro
    Chercheuse Sciences humaines
    Inscrit en
    Juillet 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheuse Sciences humaines

    Informations forums :
    Inscription : Juillet 2014
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Pour clore cette conversation et donner des pistes aux suivants, voilà la solution pour laquelle j'ai opté :

    Pas de concaténation !! Et oui, on a beau se rebeller contre les préceptes, une concaténation est bel et bien une recomposition de l'information !

    Donc j'ai fini par accepter le fait qu'il me fallait des identifiants de 1 à n pour chacune de mes tables. Autrement dit, ma table FAIT_FUN aura des enregistrements nommés successivement de 1 à n bien que ceux-ci ne proviennent pas des mêmes sites. Cela correspond simplement à mon corpus de données, indépendamment du reste. Je n'utilise les numéros d'origine qu'à titre d'info mémorielle mais pas comme identifiant sur ma base.

    Merci pour votre aide en tous cas ! Et je suis à dispo pour expliquer à ceux qui auraient le même problème...

Discussions similaires

  1. Concaténation dans un $_REQUEST ?
    Par khaled.mtibaa dans le forum Langage
    Réponses: 1
    Dernier message: 20/04/2006, 15h31
  2. Concaténation dans Body de CDONT
    Par Hamdi dans le forum ASP
    Réponses: 9
    Dernier message: 30/03/2006, 16h04
  3. Réponses: 12
    Dernier message: 10/11/2005, 09h05
  4. [Visual Web] [SJSC] Concaténation dans requête SQL
    Par Original Prankster dans le forum NetBeans
    Réponses: 22
    Dernier message: 15/08/2005, 14h50
  5. Procédure stockée, concaténation dans requête
    Par sbeu dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/08/2005, 12h03

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