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

Langage SQL Discussion :

Logique de requête - Optimisation (HQL)


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juin 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2017
    Messages : 37
    Par défaut Logique de requête - Optimisation (HQL)
    Bonjour,
    Je cherche une astuce pour minimiser une requête que je dois faire car très limité en nombre de caractères qu'importe le langage, l'essentiel étant dans l'approche.

    L'idée est de remplacer des "sous-select" par des jointures et des conditions permettant d'être fin dans le code.

    Je dois interroger un formulaire d'une base de données de mon logiciel métier dans lequel il y a des boutons-radios.

    Je suis arrivé à "minimiser" les choses dans la clause FROM et à trouver les réponses à la question 1, mais je ne sais ensuite pas comment dire dans les autres clauses je veux lire les réponses à la question 2 etc.

    Notez que la requête citée ici est en HQL

    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
    16
    17
     
    SELECT 
    data1.caud_libelle as question1, data2.caud_libelle as question2
     
    FROM
    Frm_instance_formulaire as fifo
    join fifo.frm_formulaire as form
    join fifo.frm_instance_rubriques as irub
    join irub.frm_valeurs as valeur1 
    join irub.frm_formulaire_rubrique as rub1 with rub1.foru_code = 'QUESTION1'
    join irub.frm_formulaire_rubrique as rub2 with rub2.foru_code = 'QUESTION2',
     
    Bas_catalogue_util_data as data1
     
    WHERE 
    form.form_code = 'code_formulaire'
    and valeur1.fval_id_objet = data1.id
    Je sais bien que mon problème se situe autour de la jointure externe "Bas_catalogue_util_data as data1", mais je ne sais pas comment formuler la chose.

    Je m'en sors facilement avec 2 sous-select contenant les instances de rubriques et cette jointure externe mais je suis persuadé qu'il y a mieux et plus puissant.

    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
    16
    17
    18
    19
    20
    21
     
    SELECT
    (select data1.caud_libelle from fifo.frm_instance_rubriques as instrub1 
    join instrub1.frm_formulaire_rubrique as frub1 
    join instrub1.frm_valeurs as valrub1, 
    Bas_catalogue_util_data as data1 where valrub1.fval_id_objet = data1.id
    and frub1.foru_code = 'QUESTION1') 
    (select data2.caud_libelle from fifo.frm_instance_rubriques as instrub2 
    join instrub2.frm_formulaire_rubrique as frub2 
    join instrub2.frm_valeurs as valrub2, 
    Bas_catalogue_util_data as data2 where valrub2.fval_id_objet = data2.id
    and frub1.foru_code = 'QUESTION1') 
     
     
    FROM 
    Frm_instance_formulaire as fifo
    join fifo.frm_formulaire as frm
     
     
    WHERE
    and frm.form_code = 'code_formulaire'



    Si vous pouviez m'aider à avoir la logique manquante...

    Je vous remercie.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ma boule de cristal m'indique que vous devriez chercher du côté de PIVOT.
    Je serait étonné que cet opérateur soit implémenté en HQL, mais la logique avec des max(case) est elle valable quel que soit le SGBD.

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Bizarres ces jointures sans condition de jointure !

    Syntaxe de la jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM table_1 AS t1
    JOIN table_2 AS t2 ON t1.une_colonne_de_table_1 = t2.une_colonne_de_table_2
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 639
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Bizarres ces jointures sans condition de jointure !
    Je crains qu'il s'agisse d'un NATURAL JOIN à corriger d'urgence si c'est bien le cas !

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ou pire : des produits cartésiens de tables !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juin 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2017
    Messages : 37
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Bizarres ces jointures sans condition de jointure !

    Syntaxe de la jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM table_1 AS t1
    JOIN table_2 AS t2 ON t1.une_colonne_de_table_1 = t2.une_colonne_de_table_2


    Pour la syntaxe des jointures elle est correcte. Comme je l'ai indiqué, j'interroge la base de données d'un logiciel métier et c'est comme ceci que doivent être écrites les jointures selon l'éditeur.

    C'est surtout l'approche que je cherche.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 639
    Billets dans le blog
    10
    Par défaut
    La syntaxe est correcte, sans doute s'il n'y a pas de messge d'erreur, mais comment HQL fait il la distinction entre les différents types de jointure Mystère...

    La doc ici (chapitre 14.3) me laisse perplexe sur ce point

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    HQL : langage de requête d'Hibernate, un Outil Réellement Merdique que j'ai eu le déplaisir de devoir utiliser il y a quelques années.
    J'avais à l'époque posté une discussion sur ma difficulté à réaliser une requête un peu complexe avec ce machin et j'ai fini par écrire la requête en SQL en 1/4 d'heure et l'ai balancée directement à Hibernate parce que j'avais enfin trouvé une syntaxe qui permettait de le faire.

    J'avais aussi constaté dans les logs qu'Hibernate lançait en fait beaucoup de requêtes pour pas grand chose et parfois plusieurs fois la même.

    Je ne sais pas si ça s'est amélioré depuis mais plutôt que de s'emmerder avec un tel outil et apprendre une nouvelle syntaxe dérivée du SQL, autant utiliser directement SQL. C'est plus propre, plus performant.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juin 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2017
    Messages : 37
    Par défaut
    Bonjour,
    Il ne semble en effet pas que PIVOT soit connu dans HQL.
    Je n'ai pas compris "la logique entre les max(case)" en revanche, j'ai choisi une solution de facilité : éviter la jointure externe et faire un CASE WHEN THEN ELSE END qui permet de convertir le fval_id_objet en réponse attendue.

    C'est peut-être pas encore propre mais ça semble fonctionner.

Discussions similaires

  1. Sous-Sous-Requête: Optimisation possible ?
    Par FMaz dans le forum Requêtes
    Réponses: 11
    Dernier message: 03/04/2008, 03h49
  2. [SQL2K5] Plan de requête optimisable ?
    Par elsuket dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/08/2007, 11h33
  3. Réponses: 2
    Dernier message: 09/11/2006, 07h37
  4. Réponses: 10
    Dernier message: 20/10/2006, 16h36
  5. requête à optimiser
    Par tung-savate dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/10/2005, 07h38

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