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

HyperFileSQL Discussion :

[WD11] Left Join


Sujet :

HyperFileSQL

  1. #1
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut [WD11] Left Join
    Bonjour,

    J'ai un petit souci avec une requête, et plus particulièrement la clause "Left Join".

    J'ai 2 tables :

    Statistiques
    IDStatistique, int, clé autoincrémentée
    Intitule, chaîne(55)
    IDGroupesStat, int

    ClientsStat
    CodeClient, int, clé
    IDStatistique, int, clé
    Valeur, chaîne(155)
    Mon but est d'afficher toutes les statistiques d'une catégorie et, pour chaque ligne, la valeur d'un client donné :

    Statistique1
    Statistique2, 5
    Statistique3, 10
    Statistique4
    Le problème, c'est que HyperFile ne me renvoi que les statistiques pour lesquels une valeur est enregistrée pour le client...

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Statistiques.IDStatistique,Intitule,Valeur
    FROM Statistiques 
    LEFT JOIN ClientsStat 
    ON Statistiques.IDStatistique=ClientsStat.IDStatistique 
    AND ClientsStat.CodeClient='123456' 
    WHERE Statistiques.IDGroupesStat=1
    ORDER BY IDStatistique
    Je sais pas si j'ai réussi à bien m'expliquer... J'ai vu sur le forum que WD comportait une sorte de bug sur les "LEFT JOIN", mais j'ai l'impression ici que c'est plus moi qui ne sait pas m'y prendre...

  2. #2
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Je viens de me rendre compte d'un détail "intéressant".

    Lorsque j'exécute ma requête avec comme critère la catégorie "2", la requête marche bien. Mais pas avec les critères de catégorie "1" ou "3".

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    C'est un problème de SQL qui n'est pas spécifique à Hyperfile, postez plutôt dans le forum SQL.

    Ensuite, vous ne donnez pas les bons noms pour les tables et colonnes. Ceux que vous utilisez dans votre requête ne sont pas les même que ceux dans la description des tables.

  4. #4
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Oui oui c'est un peu la pagaille...

    Je rétablie tout ça et je poste tout ça dans le forum SQL.

    Cependant je tiens à préciser que j'ai testé la même configuration sous "SQL Server" et sous "MySQL" et ma requête fonctionne bien.

    C'est pour cela que j'ai pensé qu'il s'agissait d'un mode de fonctionnement différent d'HyperFile...

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,
    Citation Envoyé par windmastr26 Voir le message

    Je rétablie tout ça et je poste tout ça dans le forum SQL.

    Cependant je tiens à préciser que j'ai testé la même configuration sous "SQL Server" et sous "MySQL" et ma requête fonctionne bien.

    C'est pour cela que j'ai pensé qu'il s'agissait d'un mode de fonctionnement différent d'HyperFile...
    Je suis d'accord avec ton message initial qui est bien placé.
    Le dialecte SQL d'HyperFile est particulier.
    Il faut commencer par poser ta question sur le sous-forum WinDev/HyperFileSQL car c'est ici que sont les développeurs HyperFile du forum.

    Donc oui, le SQL de HF ne gère pas la jointure avec un littéral (comme une chaîne de caractère ou un nombre).

    A la place, tu pourrais essayer une sous-requête dans la jointure:
    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
    SELECT 
        Statistiques.IDStatistique, 
        Statistiques.Intitule, 
        ClientsInfos.Valeur
    FROM 
        Statistiques 
        LEFT OUTER JOIN
        (   SELECT IDStatistique, Valeur 
            FROM ClientsStat 
            WHERE CodeClient='123456' ) ClientsInfos  
        ON Statistiques.IDStatistique=ClientsInfos.IDStatistique 
    WHERE 
        Statistiques.IDGroupesStat=1
    ORDER BY 
        Statistiques.IDStatistique

  6. #6
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Je ne sais pas quoi dire : c'est une excellente idée et pour preuve ca marche !!

    J'avais peur en revanche avec cette idée du temps d'exécution mais il en est rien : la requête reste rapide.

    Un grand merci à toi JBO

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par windmastr26 Voir le message

    J'avais peur en revanche avec cette idée du temps d'exécution mais il en est rien : la requête reste rapide.
    Au cas où il y aurait un problème de performance, au cas où la table fichier ClientsStat serait vraiment énorme, tu peux quand même l'accélérer en compliquant la sous-requête.

    J'imagine que les rubriques IDStatistique et IDGroupesStat sont des clés (avec de tels noms, je n'en doute pas ), alors tu peux en plus faire une jointure dans la sous-requête.

    Code SQL : 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
    SELECT 
        Statistiques.IDStatistique, 
        Statistiques.Intitule, 
        ClientsInfos.Valeur
    FROM 
        Statistiques 
        LEFT OUTER JOIN
        (   SELECT IDStatistique, Valeur 
            FROM ClientsStat INNER JOIN Statistiques 
            ON ClientsStat.IDStatistique=Statistiques.IDStatistique 
            WHERE CodeClient='123456' AND Statistiques.IDGroupesStat=1 ) ClientsInfos  
        ON Statistiques.IDStatistique=ClientsInfos.IDStatistique 
    WHERE 
        Statistiques.IDGroupesStat=1
    ORDER BY 
        Statistiques.IDStatistique

    Ça devrait booster ta requête.
    _

  8. #8
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Avec 20 000 clients et près d'une vingtaine de statistiques pour chacun, ça risque d'être gros en effet Je suivrai ton conseil quand ma table sera un peu plus remplie.

    Merci encore.

  9. #9
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Octobre 2004
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 254
    Points : 608
    Points
    608
    Par défaut
    Pour info., une action est en cours auprès de PCsoft pour faire corriger ce pb (et d'autres) sur les jointures externes.

    Nous tiendrons le forum au courant si l'éditeur bouge.

    Arnaud.

    Citation Envoyé par =JBO= Voir le message
    Bonjour,


    Je suis d'accord avec ton message initial qui est bien placé.
    Le dialecte SQL d'HyperFile est particulier.
    Il faut commencer par poser ta question sur le sous-forum WinDev/HyperFileSQL car c'est ici que sont les développeurs HyperFile du forum.

    Donc oui, le SQL de HF ne gère pas la jointure avec un littéral (comme une chaîne de caractère ou un nombre).

    A la place, tu pourrais essayer une sous-requête dans la jointure:
    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
    SELECT 
        Statistiques.IDStatistique, 
        Statistiques.Intitule, 
        ClientsInfos.Valeur
    FROM 
        Statistiques 
        LEFT OUTER JOIN
        (   SELECT IDStatistique, Valeur 
            FROM ClientsStat 
            WHERE CodeClient='123456' ) ClientsInfos  
        ON Statistiques.IDStatistique=ClientsInfos.IDStatistique 
    WHERE 
        Statistiques.IDGroupesStat=1
    ORDER BY 
        Statistiques.IDStatistique

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Citation Envoyé par Arnaud B. Voir le message
    Pour info., une action est en cours auprès de PCsoft pour faire corriger ce pb (et d'autres) sur les jointures externes.

    Nous tiendrons le forum au courant si l'éditeur bouge.
    Merci Arnaud, c'est très sympa d'assurer ce suivi.

    Pour ma part, je commence à être littéralement "épuisé" par les immenses lacunes du SQL d'HyperFile.
    Que d'efforts et de temps passé pour "coder" là où une requête SQL bien pensée aurait fait le job dans d'autres SGBD.
    Même le SQL de Microsoft Access est meilleur !

    Alors pourquoi attendre ces améliorations tellement "élémentaires" ?
    Doucement mais sûrement, je glisse vers PostgreSQL.
    _

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Qu'entendez-vous par "action" ? Est ce une requête au ST ?

  12. #12
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Octobre 2004
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 254
    Points : 608
    Points
    608
    Par défaut
    Citation Envoyé par vmolines Voir le message
    Qu'entendez-vous par "action" ? Est ce une requête au ST ?
    Il s'agit d'une demande un peu plus formelle qu'une requete au ST, faite par un gros utilisateur de Windev (je ne le cite pas car je ne sais pas s'il veut le faire savoir), demande à laquelle nous nous sommes associés.

    Le ST a fourni un correctif mais qui ne semble pas corriger les problèmes (pour notre part, nous n'avons pas encore eu le temps de faire des tests).

    Pour réagir à JBO, nous sommes en train de mener des tests de qualification pour utiliser postgreSQL et nous développons actuellement un outil qui permettra de synchroniser automatiquement un schéma postgres avec l'analyse Windev (l'équivalent de WDModif).

    Pour l'instant, on continue avec HF C/S mais si rien ne change en 2012 il est possible que nous passions à postgres si les tests sont concluants.

    Cordialement, Arnaud Benhamdine.

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

Discussions similaires

  1. [WD11] LEFT JOIN multiples
    Par windmastr26 dans le forum HyperFileSQL
    Réponses: 21
    Dernier message: 22/06/2021, 17h13
  2. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 16h38
  3. Interbase et left join
    Par Zog dans le forum Bases de données
    Réponses: 4
    Dernier message: 23/03/2004, 08h55
  4. Non coincident MySQL (Left Join)
    Par Remiguel dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/11/2003, 21h25
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 13h57

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