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 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
    Points : 262
    Points
    262
    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 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 786
    Points
    30 786
    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 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
    Points : 262
    Points
    262
    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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    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. Autoentrepreneur.
    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 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
    Points : 262
    Points
    262
    Par défaut
    d'accord mais sur mon exemple c'est un LEFT, RIGHT ou FULL ?

  6. #46
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    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. Autoentrepreneur.
    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