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 :

Simplifier requête SQL


Sujet :

Langage SQL

  1. #41
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Autre question, pour une autre requête que je dois modifier, à quoi correspond les + dans les jointures, FULL JOIN ?

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    SELECT
        decode(PATIENT.SEXE,'M','Mr','F','Mme') AS TITRE         ,
        PATIENT.NOM                             AS NOM           ,
        substr(RDV.DATE_RDV, 7, 2)||'/'||
            substr(RDV.DATE_RDV,  5, 2)||'/'||
                substr(RDV.DATE_RDV, 0, 4)      AS DATE_RDV      ,
        substr(RDV.DATE_RDV, 9, 2)||':'||
            substr(RDV.DATE_RDV, 11, 2)         AS HEURE_RDV     ,
        CONTACT.LIBELLE                         AS NUM_TEL       ,
        RESSOURCE.REF_TYPE_RESSOURCE            AS TYPE_RESSOURCE,
        RESSOURCE.NOM                           AS NOM_RESSOURCE ,
        SERVICE.NOM                             AS NOM_SERVICE   ,
        TYPE_RDV.LIBELLE                        AS TYPE_RDV      ,
        RDV_STATUT.LIBELLE                      AS STATUT_LIBELLE,
        EJ_PERSO.TITRE                          AS TITRE_RESOURCE
     
    FROM
        PATIENT             PATIENT  ,
        DXP_CONTACT_PATIENT CONTACT  ,
        RDV                          ,
        DXP_RESSOURCE       RESSOURCE,
        EJ_SRV              SERVICE  ,
        RDV_PATIENT         TYPE_RDV ,
        ACTE_RDV                     ,
        RDV_STATUT                   ,
        EJ_PERSO                       -- Table pour récupérer le titre du médecins
     
    WHERE 
        CONTACT.DATE_DERNIERE_UTILISATION = (
                                             SELECT
                                                 MAX(DATE_DERNIERE_UTILISATION) 
                                             FROM 
                                                 DXP_CONTACT_PATIENT CONTACT2
                                             WHERE
                                                 CONTACT.REF_PATIENT = CONTACT2.REF_PATIENT
                                            ) AND
        (CONTACT.LIBELLE like '06%' OR CONTACT.LIBELLE like '07%')    AND 
        (substr(RDV.DATE_RDV, 1, 8) BETWEEN to_char(sysdate + 1, 'yyyymmdd') AND to_char(sysdate + 365, 'yyyymmdd')) AND
        PATIENT.NIPATIENT  = CONTACT.REF_PATIENT    AND
        PATIENT.NIPATIENT  = RDV.NIPATIENT          AND
        RDV.NIBOX          = RESSOURCE.ID_DXCARE(+) AND
        RDV.NISERVICE      = SERVICE.NISERVICE(+)   AND
        RDV.TYPE_RDV       = TYPE_RDV.CODE(+)       AND
        RDV.RDV_IDE        = ACTE_RDV.NIACTERDV(+)  AND
        ACTE_RDV.STATUTRDV = RDV_STATUT.NI(+)       AND
        ACTE_RDV.STATUTRDV = '2'                    AND
        PATIENT.RETRAIT    = 'F'                    AND
        RDV_STATUT.RETRAIT = 'F'                    AND
        ACTE_RDV.NIACTE    <> '453432'              AND -- Ne pas envoyé à certain type de consultation
        PATIENT.NOM        <> '###DXP###'           AND
        RESSOURCE.CODE     = EJ_PERSO.MATRICULE(+)

  2. #42
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 143
    Par défaut
    C'est le système de notation des jointures externes utilisé par Oracle jusqu'à ce qu'ils acceptent d'appliquer la norme...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #43
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Ce sont bien des RIGHT OUTER JOIN ? :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    SELECT
        decode(PATIENT.SEXE, 
                   'M', 'Mr', 
                   'F', 'Mme')                  AS TITRE_PATIENT ,
        PATIENT   .NOM                          AS NOM_PATIENT   ,
        substr(RDV.DATE_RDV, 7, 2)||'/'||
            substr(RDV.DATE_RDV,  5, 2)||'/'||
                substr(RDV.DATE_RDV, 0, 4)      AS DATE_RDV      ,
        substr(RDV.DATE_RDV, 9, 2)||':'||
            substr(RDV.DATE_RDV, 11, 2)         AS HEURE_RDV     ,
        CONTACT   .LIBELLE                      AS NUM_TEL       ,
        RESSOURCE .REF_TYPE_RESSOURCE           AS TYPE_RESSOURCE,
        RESSOURCE .NOM                          AS NOM_RESSOURCE ,
        SERVICE   .NOM                          AS NOM_SERVICE   ,
        TYPE_RDV  .LIBELLE                      AS TYPE_RDV      ,
        RDV_STATUT.LIBELLE                      AS STATUT_LIBELLE,
        EJ_PERSO  .TITRE                        AS TITRE_RESOURCE
     
    FROM
        PATIENT,
        INNER JOIN       DXP_CONTACT_PATIENT CONTACT   ON PATIENT .NIPATIENT = CONTACT   .REF_PATIENT -- Jointure avec la table DXP_CONTACT_PATIENT
        INNER JOIN       RDV                           ON PATIENT .NIPATIENT = RDV       .NIPATIENT   -- Jointure avec la table RDV
        RIGHT OUTER JOIN DXP_RESSOURCE       RESSOURCE ON RDV     .NIBOX     = RESSOURCE .ID_DXCARE   -- Jointure avec la table DXP_RESSOURCE
        RIGHT OUTER JOIN EJ_SRV              SERVICE   ON RDV     .NISERVICE = SERVICE   .NISERVICE   -- Jointure avec la table EJ_SRV
        RIGHT OUTER JOIN RDV_PATIENT         TYPE_RDV  ON RDV     .TYPE_RDV  = TYPE_RDV  .CODE        -- Jointure avec la table RDV_PATIENT
        RIGHT OUTER JOIN ACTE_RDV                      ON RDV     .RDV_IDE   = ACTE_RDV  .NIACTERDV   -- Jointure avec la table ACTE_RDV
        RIGHT OUTER JOIN RDV_STATUT                    ON ACTE_RDV.STATUTRDV = RDV_STATUT.NI          -- Jointure avec la table RDV_STATUT
        RIGHT OUTER JOIN EJ_PERSO                      ON RESSOURCE.CODE     = EJ_PERSO  .MATRICULE   -- Jointure avec la table EJ_PERSO
     
    WHERE 
        CONTACT.DATE_DERNIERE_UTILISATION = (
                                             SELECT
                                                 MAX(DATE_DERNIERE_UTILISATION) 
                                             FROM 
                                                 DXP_CONTACT_PATIENT CONTACT2
                                             WHERE
                                                 CONTACT.REF_PATIENT = CONTACT2.REF_PATIENT
                                            ) AND
        (CONTACT.LIBELLE like '06%' OR CONTACT.LIBELLE like '07%')    AND 
        substr(RDV.DATE_RDV, 1, 8) = to_char(sysdate + 1, 'yyyymmdd') AND -- On Récupère les RDV du lendemain
        ACTE_RDV  .STATUTRDV = '2'                    AND
        PATIENT   .RETRAIT   = 'F'                    AND
        RDV_STATUT.RETRAIT   = 'F'                    AND
        ACTE_RDV  .NIACTE    <> '453432'              AND -- Ne pas envoyé à certain type de consultation
        PATIENT   .NOM       <> '###DXP###'
    L'ordre des jointures à une importance ?

  4. #44
    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 : 63
    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
    FULL JOIN c'est FULL OUTER JOIN, non ?

    C'est à dire une double jointure externe LEFT et RIGHT.

    FROM A FULL OUTER JOIN B donnera toutes les lignes de A et de B avec la correspondance quand elle existe, NULL sinon.
    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 !

  5. #45
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    d'accord mais sur mon exemple c'est un LEFT, RIGHT ou FULL ?

  6. #46
    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 : 63
    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
    Autre question, pour une autre requête que je dois modifier, à quoi correspond les + dans les jointures, FULL JOIN ?
    J'avais mal lu la question et pas regardé la requête parce que Waldar avait répondu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM RDV, RESSOURCE
    WHERE RDV.NIBOX          = RESSOURCE.ID_DXCARE(+)
    Est l'ancienne manière d'écrire la jointure externe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM RDV
    LEFT OUTER JOIN RESSOURCE ON RDV.NIBOX = RESSOURCE.ID_DXCARE
    Tu pourrais créer une autre discussion pour cette requête si tu as des difficultés pour la simplifier.
    En l'état, c'est une belle horreur !
    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 !

Discussions similaires

  1. Aide pour Simplifier/optimiser une requête SQL
    Par bubu06 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/05/2012, 18h25
  2. [MySQL] Simplifier une requête sql et affichage dans un tableau
    Par Debutant10 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 01/05/2012, 14h36
  3. [MySQL] Simplifier une requête SQL
    Par maestro982 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 23/05/2010, 13h26
  4. [SQL] Simplifier une requête SQL ?
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/04/2006, 13h50
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

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