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

SQL Firebird Discussion :

problème de jointure


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 508
    Par défaut problème de jointure
    bonjour

    afin d'intégrer des données dans une application, je créé et j'insère dans une table

    PROMOS1 (NOM char (20) , PRENOM char (17) )

    par une commande ISQL : 524 lignes

    Je fais une sélection sur cette table et j'insère par programme Delphi (connecté en ISO_8859_1) dans une autre table

    PRATICIEN (PRA_NOM varchar(60) PRA_PRENOM varchar (60))

    Le résultat de cette opération crée 344 lignes dans PRATICIEN.

    Si j'exécute cette requête (Flamerobin)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from  PRATICIEN , promos1
    where pra_nom=nom 
    and pra_prenom=prenom 
    order by nom,prenom
    le résultat donne 313 lignes

    si j'exécute celle ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select nom,prenom from Promos1 
    where exists (select * from praticien where nom=pra_nom and prenom=pra_prenom)
    order by nom,prenom
    le résultat donne 344 lignes

    Si je recherche les différences entre les deux ensembles je m'aperçois que toutes les lignes dont le champs 'NOM' ou 'PRA_NOM' contient un "i tréma" sont éliminés dans la 1ere requête.

    Je soupçonne donc un problème de table de caractère. Mais j'accède toujours (ISQL, Delphi ou ligne de commande) en précisant ISO8859_1.

    Donc je ne vois pas d'où vient le souci.

    Et le plus étonnant c'est que si je "force" l'apparition d'une ligne dans la 1ere requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from  PRATICIEN , promos1
    where pra_nom=nom 
    and pra_prenom=prenom 
    and nom='ANAÏS'
    la ligne contenant ce champ apparait.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    je ne crois pas que les Ï aient quelque chose à voir, à première lecture je me demandais même pourquoi le titre avait le mot jointure

    voilà ma proposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT P.*,O.* FROM  PRATICIEN P LEFT JOIN  promos1 O
    ON  P.PRA_NOM=O.nom
    AND P. PRA_prenom= O.prenom 
    ORDER BY 1,2
    et une question :
    Les deux tables n'ont pas les mêmes longueur de champs comment la jointure peut -elle être juste ? (je n'ai pas compris quel était celle de base)
    Pas d'index ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PROMOS1 (NOM char (20) , PRENOM char (17) )
    PRATICIEN (PRA_NOM varchar(60) PRA_PRENOM varchar (60))
    tes champs sont-ils assez longs (codification ISO un 'Ï' longueur 2 )

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 508
    Par défaut
    Bonjour

    Effectivement je récupère une table externe avec des champs de taille imposée pour instruire une table applicative avec des champs de tailles différentes.

    j'ai contourné le problème en ajoutant un identifiant qui fait une jointure parfaite entre les deux tables. Mais d'un point de vue théorique, j'aimerais quand même comprendre ce qui se passe.

    (il me semblait que l'utilisation d'une clause WHERE évoquait une jointure. Je ne souhaite d'ailleurs pas une jointure ouverte mais bien appairer un à un des lignes de 2 tables dont une est un extrait de l'autre)

    Donc cela m'a mis sur la piste de blancs qui traînent à droite. Et comme je suis un peu distrait, j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from  PRATICIEN , promos1
    where ltrim(pra_nom)=nom 
    and pra_prenom=prenom 
    order by nom,prenom
    J'aurais bien sur dû faire rtrim et non ltrim qui retire les espaces à gauche. Mais curieusement, dans ce cas "ça fonctionne" et me retourne bien la totalité des lignes recherchées.

    Du coup je tente la chose suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select strlen(ltrim(pra_nom)), strlen(pra_nom), pra_prenom, prenom
    from  PRATICIEN , promos1
    where ltrim(pra_nom)=nom
    and pra_prenom=prenom 
    order by nom,prenom
    La taille de strlen(ltrim(pra_nom)) est identique à strlen(pra_nom)
    mais la présence de ltrim suffit à modifier le résultat de la requête.

    Pour la présence des Ï, j'observe simplement que les lignes qui disparaissent entre les deux versions de requêtes sont précisément celles qui contiennent un caractère de ce type. C'est une observation, par encore une déduction.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 508
    Par défaut
    Deux choses

    si au lieu d'utiliser ltrim, j'utilise rtrim cela agit de la même façon et je retrouve la totalité des lignes recherchées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select strlen(rtrim(pra_nom)), strlen(pra_nom), pra_prenom, prenom
    from PRATICIEN , promos1
    where rtrim(pra_nom)=nom
    and pra_prenom=prenom 
    order by nom,prenom
    Maintenant il semble en effet que le problème ne vient pas des Ï car seules les deux premières lignes manquantes présentent cette particularité.

    Conclusion : bien que ltrim et rtrim ne modifient pas la taille du champ, leur présence semblent influer sur le résultat de la requête.

    Je précise que les champs de la table PRATICIEN viennent de la table PROMOS1 par une application Delphi qui construit comme suit la requête d'insertion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QuotedStr(Trim(Nom)),QuotedStr(Trim(Prenom))
    où Nom et Prenom sont des TIBTable.TFieldName.AsString passés en paramètre

    Et pourtant, c'est en faisant LTRIM ou RTRIM du champ de la table construite par des Trim() que cela agit sur la requête. Un vrai jus de chique !

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Une autre remarque

    une colonne CHAR(20) fait toujours une longueur de 20 , blancs à droite

    une colonne VARCHAR(20) sera une chaine se terminant par nul
    donc en ISO je pense que ANAIS donnerait une longueur de 5
    et ANAÏS une de 6

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 508
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Une autre remarque

    une colonne CHAR(20) fait toujours une longueur de 20 , blancs à droite
    Juste
    une colonne VARCHAR(20) sera une chaine se terminant par nul
    donc en ISO je pense que ANAIS donnerait une longueur de 5
    et ANAÏS une de 6
    ok pour la marque de fin mais anaïs donne 5 tout comme anais. Vérification faite avec

    select strlen(pra_prenom),pra_prenom
    from PRATICIEN
    where pra_prenom < 'B'
    order by 2
    j'obtiens
    6 Adrien
    9 Alexandra
    9 Alexandre
    6 Alexia
    6 Alexis
    6 Alexis
    5 Alice
    7 Alissia
    5 Anais
    5 Anaïs
    14 Anne-Charlotte
    11 Anne-Claire
    11 Anne-Claire
    11 Anne-Sophie
    11 Anne-Sophie
    6 Anouck
    7 Antoine
    7 Antoine
    6 Audrey
    7 Aurélie
    4 Ayah

Discussions similaires

  1. Problème de jointure de tables
    Par AurelBUD dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2005, 16h27
  2. Probléme de jointure
    Par Ajrarn dans le forum Langage SQL
    Réponses: 14
    Dernier message: 24/02/2005, 14h57
  3. Vraisemblable problème de jointure
    Par pimousse76 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2005, 15h34
  4. [MS Access] Problème de jointure
    Par Erakis dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2005, 21h15
  5. Problème de jointure ?!
    Par ebaynaud dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/11/2004, 11h27

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