Précédent   Forum des professionnels en informatique > Environnements de développement > WinDev > HyperFileSQL
HyperFileSQL HyperFileSQL est un système de gestion de base de données relationnel exploité par les logiciels WinDev, WebDev et WinDev Mobile.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/05/2011, 16h21   #1
Membre du Club
 
Avatar de windmastr26
 
Homme
Développeur informatique
Inscription : juillet 2009
Messages : 176
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 : 176
Points : 48
Points : 48
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 :

Citation:
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é :

Citation:
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 :
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...
windmastr26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 17h09   #2
Membre du Club
 
Avatar de windmastr26
 
Homme
Développeur informatique
Inscription : juillet 2009
Messages : 176
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 : 176
Points : 48
Points : 48
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".
windmastr26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 17h30   #3
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
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.
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 17h33   #4
Membre du Club
 
Avatar de windmastr26
 
Homme
Développeur informatique
Inscription : juillet 2009
Messages : 176
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 : 176
Points : 48
Points : 48
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...
windmastr26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 19h20   #5
En attente de confirmation mail
 
Inscription : février 2005
Messages : 1 731
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 1 731
Points : 2 010
Points : 2 010
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 :
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
=JBO= est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 19h32   #6
Membre du Club
 
Avatar de windmastr26
 
Homme
Développeur informatique
Inscription : juillet 2009
Messages : 176
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 : 176
Points : 48
Points : 48
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
windmastr26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 19h41   #7
En attente de confirmation mail
 
Inscription : février 2005
Messages : 1 731
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 1 731
Points : 2 010
Points : 2 010
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 :
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.
_
=JBO= est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 19h43   #8
Membre du Club
 
Avatar de windmastr26
 
Homme
Développeur informatique
Inscription : juillet 2009
Messages : 176
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 : 176
Points : 48
Points : 48
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.
windmastr26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 12h26   #9
Membre confirmé
 
Homme Arnaud Benhamdine
Directeur technique
Inscription : octobre 2004
Messages : 157
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Benhamdine
Localisation : France

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

Informations forums :
Inscription : octobre 2004
Messages : 157
Points : 263
Points : 263
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 :
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
Arnaud B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 12h35   #10
En attente de confirmation mail
 
Inscription : février 2005
Messages : 1 731
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 1 731
Points : 2 010
Points : 2 010
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.
_
=JBO= est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h19   #11
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
Qu'entendez-vous par "action" ? Est ce une requête au ST ?
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 17h16   #12
Membre confirmé
 
Homme Arnaud Benhamdine
Directeur technique
Inscription : octobre 2004
Messages : 157
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Benhamdine
Localisation : France

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

Informations forums :
Inscription : octobre 2004
Messages : 157
Points : 263
Points : 263
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.
Arnaud B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h03.


 
 
 
 
Partenaires

Hébergement Web