Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide pour une requête SQL

Sujet résolu
    28 septembre 2021 à 14:27:51

    Bonjour à tous,

    Je dois écrire une requête SQL pour récupérer certaines informations sur des individus et je m’avoue un peu limité dans mes connaissances.
    J'utilise un outil de création de requêtes automatique qui me génère des requêtes simple avec toutes les jointures de tables et les conversions déjà faites. Lorsqu'il y a des requêtes plus complexes en revanche je dois les retoucher.

    Ici j'ai donc des individus référencés par un numéro unique, chacun à ensuite un dossier avec des informations identifiées par un code spécifique exemple code "SG_A1N"/résultat blond ou code "SG_C2N"/résultat 1m80)

    L'objectif est de récupérer 5 informations spécifiques pour toutes les individus dont au moins 1 des 5 résultats à été enregistré dans un certain intervalle de temps.

    Pour vous donner un aperçut, ma requête actuellement est celle ci :

    SELECT
      IDENTIFICATION.IDNT_CODE,
      CHOICE.CHC_NAME
    
    FROM
      IDENTIFICATION,
      PERSON,
      RESULT,
      PROPERTY  PROPERTY_RES,
      CHOICE,
      REQUEST,
      ORDER_,
      OBJECT
    
    WHERE
      ( PERSON.PRSN_CORRESPONDENT=IDENTIFICATION.IDNT_TARGET(+) )
      AND  ( RESULT.RSLT_ID(+)=REQUEST.RQST_RESULT              )
      AND  ( REQUEST.RQST_ORDER(+)=ORDER_.ORD_ID                )
      AND  ( ORDER_.ORD_OBJECT=OBJECT.OBJ_ID(+)                 )
      AND  ( OBJECT.OBJ_ID=PERSON.PRSN_OBJECT(+)                )
      AND  ( PROPERTY_RES.PROP_ID(+)=RESULT.RSLT_PROPERTY       )
      AND  ( CHOICE.CHC_ID(+)=RESULT.RSLT_CHOICE                )
      AND
      (
       PROPERTY_RES.PROP_MNEMONIC  IN  ( 'SG_A1N','SG_A2N','SG_B1N','SG_B2N','SG_C1N' )
       AND
       RESULT.RSLT_VALIDATIONTIME  BETWEEN  '01/06/2020'  AND  '31/05/2021'
      )



    L’inconvénient avec est que je n'obtient que les résultats enregistrés dans cet intervalle, alors que j'aimerai aussi ceux en dehors du moment qu'au moins 1 y est compris.

    Au final les jointures, le SELECT et le FROM sont corrects mais il me faudrait une idée pour modifier le WHERE afin que je récupère aussi ces valeurs.

    J’espère avoir été clair, n'hésitez pas à me poser des questions.

    Merci d'avance !

    -
    Edité par ptrs32 28 septembre 2021 à 15:14:27

    • Partager sur Facebook
    • Partager sur Twitter
      28 septembre 2021 à 16:22:17

      Bonjour,

      Si l'on réécrit la requête avec une syntaxe plus structurée, on obtient :

      SELECT
      	IDENTIFICATION.IDNT_CODE,
      	CHOICE.CHC_NAME
      FROM
      	ORDER_
      		LEFT JOIN OBJECT
      			ON ORDER_.ORD_OBJECT=OBJECT.OBJ_ID
      		LEFT JOIN REQUEST
      			ON REQUEST.RQST_ORDER=ORDER_.ORD_ID
      		LEFT JOIN RESULT
      			ON RESULT.RSLT_ID=REQUEST.RQST_RESULT
      		LEFT JOIN PROPERTY PROPERTY_RES
      			ON PROPERTY_RES.PROP_ID=RESULT.RSLT_PROPERTY
      		LEFT JOIN CHOICE
      			ON CHOICE.CHC_ID=RESULT.RSLT_CHOICE
      		LEFT JOIN PERSON
      			ON OBJECT.OBJ_ID=PERSON.PRSN_OBJECT
      		LEFT JOIN IDENTIFICATION
      			ON PERSON.PRSN_CORRESPONDENT=IDENTIFICATION.IDNT_TARGET
      WHERE
      	PROPERTY_RES.PROP_MNEMONIC IN ( 'SG_A1N','SG_A2N','SG_B1N','SG_B2N','SG_C1N' ) 
      	AND RESULT.RSLT_VALIDATIONTIME BETWEEN '01/06/2020' AND '31/05/2021'

      ptrs32 a écrit:

      j'aimerai aussi ceux en dehors du moment qu'au moins 1 y est compris

      Dans la structure actuelle, on part de RESULT pour aller vers PROPERTY et les deux tables ont une condition WHERE ... donc impossible d'écrire la contrainte souhaitée ... puisque les deux entités sont interdépendantes ...

      Une idée serait de filtrer dans une sous-requête les identifications entrant dans les critères de date pour au moins une property :

      SELECT
      	IDENTIFICATION.IDNT_CODE,
      	CHOICE.CHC_NAME
      FROM
      	(
      		-- Personne ayant un result sur la période donnée
      		SELECT DISTINCT P.PRSN_OBJECT
      		FROM
      			ORDER_
      				INNER JOIN OBJECT
      					ON ORDER_.ORD_OBJECT=OBJECT.OBJ_ID
      				INNER JOIN PERSON P
      					ON OBJECT.OBJ_ID=PERSON.PRSN_OBJECT
      				INNER JOIN REQUEST
      					ON REQUEST.RQST_ORDER=ORDER_.ORD_ID
      				INNER JOIN RESULT
      					ON RESULT.RSLT_ID=REQUEST.RQST_RESULT
      				INNER JOIN PROPERTY PROPERTY_RES
      					ON PROPERTY_RES.PROP_ID=RESULT.RSLT_PROPERTY
      		WHERE
      			PROPERTY_RES.PROP_MNEMONIC IN ( 'SG_A1N','SG_A2N','SG_B1N','SG_B2N','SG_C1N' )
      			AND RESULT.RSLT_VALIDATIONTIME BETWEEN '01/06/2020' AND '31/05/2021'
      	) P
      		INNER JOIN PERSON
      			ON P.PRSN_OBJECT=PERSON.PRSN_OBJECT
      		INNER JOIN OBJECT
      			ON OBJECT.OBJ_ID=PERSON.PRSN_OBJECT
      		INNER JOIN ORDER_
      			ON ORDER_.ORD_OBJECT=OBJECT.OBJ_ID
      		INNER JOIN REQUEST
      			ON REQUEST.RQST_ORDER=ORDER_.ORD_ID
      		INNER JOIN RESULT
      			ON RESULT.RSLT_ID=REQUEST.RQST_RESULT
      		INNER JOIN PROPERTY PROPERTY_RES
      			ON PROPERTY_RES.PROP_ID=RESULT.RSLT_PROPERTY
      		INNER JOIN CHOICE
      			ON CHOICE.CHC_ID=RESULT.RSLT_CHOICE
      		INNER JOIN IDENTIFICATION
      			ON PERSON.PRSN_CORRESPONDENT=IDENTIFICATION.IDNT_TARGET
      WHERE PROPERTY_RES.PROP_MNEMONIC IN ( 'SG_A1N','SG_A2N','SG_B1N','SG_B2N','SG_C1N' )

      -
      Edité par Benzouye 28 septembre 2021 à 16:46:05

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        28 septembre 2021 à 18:18:14

        En fait, si tu te moques de la période, ne la mets pas dans tes critères du WHERE

        • Partager sur Facebook
        • Partager sur Twitter
          29 septembre 2021 à 0:18:29

          Ce n'est pas qu'il s'en moque, c'est qu'il veut au moins une property dans la période...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            29 septembre 2021 à 11:08:04

            ptrs32 a écrit:

            L’inconvénient avec est que je n'obtient que les résultats enregistrés dans cet intervalle, alors que j'aimerai aussi ceux en dehors du moment qu'au moins 1 y est compris.

            -

            Edité par ptrs32 il y a environ 19 heures


            j'ai mal compris alors ?
            • Partager sur Facebook
            • Partager sur Twitter
              29 septembre 2021 à 11:21:43

              Je pense :)

              Ce qui est important c'est le 

              ptrs32 a écrit:

              du moment qu'au moins 1 y est compris

              Pour moi c'est une base de personnes (identification), qui ont des propriétés (taille, poids, etc.) qui sont modifiables dans le temps. Il veut la liste des personnes avec leurs valeurs pour les 5 propriétés listées, du moment qu'une de ces 5 propriétés a été modifiée dans la période souhaitée.

              Ma proposition c'est donc de lister dans une sous-requête les personnes ayant eu une modification d'une des 5 propriétés dans la période souhaitée, puis de récupérer les valeurs des 5 propriétés pour ces personnes dans la requête principale.

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                29 septembre 2021 à 11:35:13

                Oui c'est tout à fait ça Benzouye. J'ai essayé ta proposition plus haut, ça n'a pas fonctionné mais j'ai compris l'idée et j'ai modifié ma requête. Ça fonctionne bien.

                Bon maintenant j'ai un autre soucis, j'obtiens des doublons de certains paramètres mais c'est dû à des spécificités de ma base donc je vais devoir me débrouiller.

                Merci pour l'idée, je met ma requête pour info.

                SELECT
                  IDENTIFICATION.IDNT_CODE,
                  CHOICE.CHC_NAME
                
                FROM
                  IDENTIFICATION,
                  PERSON,
                  RESULT,
                  PROPERTY  PROPERTY_RES,
                  CHOICE,
                  REQUEST,
                  ORDER_,
                  OBJECT
                
                WHERE
                  ( PERSON.PRSN_CORRESPONDENT=IDENTIFICATION.IDNT_TARGET(+) )
                  AND  ( RESULT.RSLT_ID(+)=REQUEST.RQST_RESULT              )
                  AND  ( REQUEST.RQST_ORDER(+)=ORDER_.ORD_ID                )
                  AND  ( ORDER_.ORD_OBJECT=OBJECT.OBJ_ID(+)                 )
                  AND  ( OBJECT.OBJ_ID=PERSON.PRSN_OBJECT(+)                )
                  AND  ( PROPERTY_RES.PROP_ID(+)=RESULT.RSLT_PROPERTY       )
                  AND  ( CHOICE.CHC_ID(+)=RESULT.RSLT_CHOICE                )
                  AND
                  (
                   PROPERTY_RES.PROP_MNEMONIC  IN  ('SG_A1N','SG_A2N','SG_B1N','SG_B2N','SG_C1N' )
                   AND
                   IDENTIFICATION.IDNT_CODE IN (
                
                                SELECT
                                  DISTINCT IDENTIFICATION.IDNT_CODE
                                FROM
                                  IDENTIFICATION,
                                  PROPERTY  PROPERTY_RES,
                                  RESULT,
                                  REQUEST,
                                  ORDER_,
                                  OBJECT,
                                  PERSON
                                WHERE
                                  ( PERSON.PRSN_CORRESPONDENT=IDENTIFICATION.IDNT_TARGET(+)  )
                                  AND  ( RESULT.RSLT_ID(+)=REQUEST.RQST_RESULT  )
                                  AND  ( REQUEST.RQST_ORDER(+)=ORDER_.ORD_ID  )
                                  AND  ( ORDER_.ORD_OBJECT=OBJECT.OBJ_ID(+)  )
                                  AND  ( OBJECT.OBJ_ID=PERSON.PRSN_OBJECT(+)  )
                                  AND  ( PROPERTY_RES.PROP_ID(+)=RESULT.RSLT_PROPERTY  )
                                  AND  
                                  (
                                   PROPERTY_RES.PROP_MNEMONIC  IN  ( 'SG_A1N','SG_A2N','SG_B1N','SG_B2N','SG_C1N')
                                   AND
                                   RESULT.RSLT_VALIDATIONTIME  BETWEEN  '01/06/2020'  AND  '31/05/2021'
                                  )
                          )
                  )
                



                -
                Edité par ptrs32 29 septembre 2021 à 11:39:44

                • Partager sur Facebook
                • Partager sur Twitter
                  29 septembre 2021 à 11:48:27

                  Je viens de comprendre la subtilité
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Aide pour une requête SQL

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown