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

DB2 Discussion :

Simplification de requête


Sujet :

DB2

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 12
    Points
    12
    Par défaut Simplification de requête
    Bonjour,

    Je souhaiterais savoir s'il serait possible de simplifier cette requête ? De quelques manières que ce soit ... D'avance merci à tous !!!

    Vous verrez, la ligne avec tout les REPLACE(REPLACE(REPLACE(REPLACE(........ est relativement longue mais je n'ai pas trouvé un autre moyen de la simplifier pour l'instant.

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    SELECT DISTINCT
    	MATABLE.ETAB_UAJ.CODE_RNE AS RNE_etablissement,
    	-- Remplacement des espaces vides par un tiret
    	REPLACE(MATABLE.ELEMENT_STRUCTURE.CODE_STRUCTURE,' ', '-') AS division_classe,
    	REPLACE(REPLACE(MATABLE.ELEVE.SEXE_ID, '2', 'ANGB2'), '1', 'ANGB2') AS Certif_Langue,
    	-- Remplacement des 1 (garçons) par M et des 2 (filles) par F
    	REPLACE(REPLACE(MATABLE.ELEVE.SEXE_ID, '1', 'M'), '2', 'F') AS civilite,
    	LTRIM(MATABLE.ELEVE.NOM_ELEVE) AS nom_famille,
    	MATABLE.ELEVE.NOM_USAGE_ELEVE AS nom_usage,
    	-- Concaténation des prénoms de l'élève dans 1 seule colonne avec séparateur espace vide ' '
    	COALESCE(MATABLE.ELEVE.PRENOM_ELEVE,'')||' '||
    	COALESCE(MATABLE.ELEVE.PRENOM2_ELEVE,'')||' '||
    	COALESCE(MATABLE.ELEVE.PRENOM3_ELEVE,'') as prenoms,
    	MATABLE.ELEVE.ID_NATIONAL AS ine,
    	REPLACE(MATABLE.ELEVE.PAYS_ID, '1', '100') AS pays_naissance,
    	-- Affichage de la date au format DD/MM/YYYY
    	TO_CHAR(MATABLE.ELEVE.DATE_NAISS_ELE, 'DD/MM/YYYY') AS date_naissance,
    	MATABLE.DEPT.CODE_DEPARTEMENT AS depCOM_naissance,
    	MATABLE.COMMUNE_INSEE.CODE_COMMUNE_INSEE AS commune_naissance,
    	MATABLE.PAYS.CODE_PAYS AS nationalite,
    	REPLACE(MATABLE.ADRESSE.PAYS_ID, '1', '100') AS pays_residence,
    	MATABLE.ADRESSE.LIGNE1_ADRESSE AS adresse_1,
    	MATABLE.ADRESSE.LIGNE2_ADRESSE AS adresse_2,
    	MATABLE.ADRESSE.LIGNE3_ADRESSE AS adresse_3,
    	MATABLE.ADRESSE.LIGNE4_ADRESSE AS adresse_4,
    	MATABLE.ADRESSE.CODE_POSTAL AS code_postal,
    	MATABLE.ADRESSE.LL_POSTAL AS localite,
    	MATABLE.ELEVE.TEL_PERSONNEL AS telephone,
    	MATABLE.ELEVE.EMAIL_ELEVE AS adresse_mail,
    	-- Remplacement des BTS et des TERMINALES 1BCGSEANG - 2BTNSEANG - 3BCPSEANG - 4BCGINTER
    	REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(MATABLE.MEF.CODE_MEF, '31131211220', 'BTS31211'), '31131209220', 'BTS31209'), '31131210220', 'BTS31210'), '3113121022A', 'BTS31210'), '31120008220', 'BTS20008'), '31133419220', 'BTS33419'), '31133414220', 'BTS334145'), '31133415220', 'BTS334145'), '31133420220', 'BTS33420'), '20211010112', 'BCGSEANG'), '20211011112', 'BCGSEANG'),'20212005112', 'BCGSEANG'), '20212005111', 'BCGSEANG'), '20213019112', 'BCGSEANG'), '21220006112', 'BTNSEANG'), '21220006117', 'BTNSEANG'), '2122000611M', 'BTNSEANG'),'21231017117', 'BTNSEANG'), '21231017112', 'BTNSEANG'), '2123101711M', 'BTNSEANG'),'21231018117', 'BTNSEANG'), '21231018112', 'BTNSEANG'), '2123101811M', 'BTNSEANG'),'2123100A11A', 'BTNSEANG'), '21231019112', 'BTNSEANG'), '21231019117', 'BTNSEANG'), '2123101911M', 'BTNSEANG'),'21233402112', 'BTNSEANG'), '24723004332', 'BTNSEANG'), '2472300A11A', 'BTNSEANG'),'24723005332', 'BCPSEANG'),'24723103332', 'BCPSEANG'), '24723103337', 'BCPSEANG'), '24723405332', 'BCPSEANG'), '24733403332', 'BCPSEANG'), '20211010111', 'BCGINTER'), '20213019111', 'BCGINTER') AS formation_suivie,
    	MATABLE.ELEVE.TEL_PORTABLE AS telephone_mobile
     
    FROM MATABLE.ELEVE
    INNER JOIN MATABLE.MEF ON (MATABLE.MEF.MEF_ID = MATABLE.ELEVE.MEF_ID)
    INNER JOIN MATABLE.OPTION_ELEVE ON (MATABLE.OPTION_ELEVE.ELEVE_ID = MATABLE.ELEVE.ELEVE_ID)
    INNER JOIN MATABLE.MATIERE_ENSEIGNEE ON (MATABLE.MATIERE_ENSEIGNEE.MATIERE_ENSEIGNEE_ID = MATABLE.OPTION_ELEVE.MATIERE_ENSEIGNEE_ID)
    INNER JOIN MATABLE.ETAB_UAJ ON (MATABLE.ELEVE.ETAB_UAJ_ID = MATABLE.ETAB_UAJ.ETAB_UAJ_ID)
    INNER JOIN MATABLE.COMMUNE_INSEE ON (MATABLE.ELEVE.COMMUNE_INSEE_ID = MATABLE.COMMUNE_INSEE.COMMUNE_INSEE_ID)
    INNER JOIN MATABLE.DEPT ON (MATABLE.DEPT.DEPT_INSEE_ID = MATABLE.COMMUNE_INSEE.DEPT_INSEE_ID)
    INNER JOIN MATABLE.PAYS ON (MATABLE.PAYS.PAYS_ID = MATABLE.ELEVE.PAYS_ID)
    INNER JOIN MATABLE.ELEVE_STRUCTURE ON (MATABLE.ELEVE_STRUCTURE.ELEVE_ID = MATABLE.ELEVE.ELEVE_ID)
    INNER JOIN MATABLE.ELEMENT_STRUCTURE ON (MATABLE.ELEMENT_STRUCTURE.STRUCTURE_ID = MATABLE.ELEVE_STRUCTURE.STRUCTURE_ID)
    INNER JOIN MATABLE.ELEVE_PERSONNE_ADRESSE ON (MATABLE.ELEVE_PERSONNE_ADRESSE.ELEVE_ID = MATABLE.ELEVE.ELEVE_ID)
    INNER JOIN MATABLE.PERSONNE ON (MATABLE.ELEVE_PERSONNE_ADRESSE.PERSONNE_ID = MATABLE.PERSONNE.PERSONNE_ID)
    INNER JOIN MATABLE.ADRESSE ON (MATABLE.PERSONNE.ADRESSE_ID = MATABLE.ADRESSE.ADRESSE_ID)
     
    WHERE ( MATABLE.ETAB_UAJ.CODE_RNE = '0010207M'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0010208P'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0010209K'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0110210B'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0110211W'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0410212V'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0410213N'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0410214P'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0410214E'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0410215M'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0410216U'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0610217J'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0610218C'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0610219D'
        OR  MATABLE.ETAB_UAJ.CODE_RNE = '0610220V')
     
    OR (    MATABLE.MEF.CODE_MEF = '31131211220'
        OR  MATABLE.MEF.CODE_MEF = '31131209220'
        OR  MATABLE.MEF.CODE_MEF = '31131210220'
        OR  MATABLE.MEF.CODE_MEF = '31120008220'
        OR  MATABLE.MEF.CODE_MEF = '31133419220'
        OR  MATABLE.MEF.CODE_MEF = '31133414220'
        OR  MATABLE.MEF.CODE_MEF = '31133415220'
        OR  MATABLE.MEF.CODE_MEF = '31133420220'
        ))
     
    ORDER BY
        MATABLE.ETAB_UAJ.CODE_RNE ASC ;
    @ bientôt et merci encore à tout ceux qui vont y réfléchir et aux autres aussi.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    1) la cosmétique n'a pas sa place dans une requête SQL. Supprimez toutes les concaténations cosmétique et donnez les valeurs brutes. Faite la cosmétique sur l'outil adapté (programme d'IHM).
    2) de même avec les REPLACE cosmétique (tiret par exemple)
    3) de même pour les RTRIM/LTRIM...
    4) de même pour le TO_CHAR de la date
    5) utilisez le CASE plutôt que des REPLACE de REPLACE
    6) pour votre WHERE avec ses deux multiples OR, vous devriez construire deux tables temporaires indexées et faire des jointures.
    7) vérifiez que vous avez bien les index adéquats minimaux :
    • X1 ON MATABLE.ETAB_UAJ (CODE_RNE, ETAB_UAJ_ID)
    • X2 ON MATABLE.MEF (CODE_MEF, MEF_ID)



    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Merci bien pour ces réponses, je vais tenter de mettre tout ça en marche ;-)

    J'ai des choses IMPOSÉES, comme pour la date ou le remplacement de l'espace vide par un tiret (ça pas le choix) mais après si je peux coder plus propre je vais essayer en suivant tes conseils.

    En tout cas merci, je reviens quand j'ai avancé.

    @ plus tard.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par LudoV63 Voir le message
    J'ai des choses IMPOSÉES, comme pour la date ou le remplacement de l'espace vide par un tiret (ça pas le choix) .
    Vous avez toujours le choix face à l'imbécilité.
    1) refusez...
    2) expliquer !

    Si on vous dit de sauter d'une avion sans parachute, vous obéissez ?

    Si on vous demande des performances et qu'on vous refuse les moyens, c'est que vous avez affaire à un crétin. Faites en sorte qu'il se décrétinise !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Là pour le coup c'est le gouvernement qui me demande mdr .... du coup je vais juste accepter ce qu'il me demande ;-)

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Je n'ai jamais vu un gouvernement parler…. Il y a donc soit un élu soit un fonctionnaire !

    La plupart sont incompétents… Les premiers parce qu'ils sont formatés pour assouvir leur soif de pouvoir au détriment de l'intérêt général, les seconds parce que le modèle du fonctionnarisme français est basé sur le principe d'incompétence de Peter assorti d'un je m'enfoutisme à la française…

    Note bien que le principe de désobéissance devant l'autorité est reconnus depuis l'après dernière guerre mondiale !
    http://resmilitaris.net/ressources/1..._inte_gral.pdf

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Hahaha comment dire, ça fait genre 1 mois que je bosse dans la fonction publique donc .... N'ayant connu que du privé, je ne sais quoi trop te répondre ;-)

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Ha mon pauvre…. Fuit donc cet univers malsain…. Rejoint les gilets jaunes !!! ;-)

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    L'un et l'autre ne sont pas incompatible :-)

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par LudoV63 Voir le message
    L'un et l'autre ne sont pas incompatible :-)
    Docteur Jekyll et Mystère Hyde ????

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Membre régulier
    Homme Profil pro
    growth hacker
    Inscrit en
    Novembre 2018
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : growth hacker
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2018
    Messages : 182
    Points : 116
    Points
    116
    Par défaut
    Désolé, je n'ai pas le temps de lire ton code, mais généralement, si on doit faire la même action pour plusieurs variables (replace), c'est toujours mieux de tout mettre dans une transaction

  12. #12
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Salut,

    Ok je vais regarder de ce côté là si je trouve quelque chose d'intéressant.

    Merci et @+

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Pour tes replace consécutifs, est-ce qu'une table de correspondance ne serait pas plus adaptée. Ce que je propose n'est pas l'équivalent de ce que tu fais, mais j'ai l'impression que c'est ce que tu voudrais faire
    Une table avec deux colonnes CODE_MEF, Formation_suivie

    31131211220 BTS31211
    31131209220 BTS31209
    31131210220 BTS31210
    etc
    20211011112 BCGSEANG

    Du coup tu remplaces tes multiples replace par une jointure toute simple , efficace et maintenable.


    J'ai un léger doute fonctionnel sur
    REPLACE(REPLACE(MATABLE.ELEVE.SEXE_ID, '2', 'ANGB2'), '1', 'ANGB2') AS Certif_Langue,
    J'ai du mal à comprendre comment la langue ou la certification d'une langue puisse être lié au sexe de l'éléve.
    De plus si tu remplace le sexe qui ne devrait prendre que deux valeurs plus null par 'ANGB2' que ce soit un garçon ou une fille, est-ce qu'il n'y a pas un problème ?

    Tu peux également alléger les écritures en mettant des alias au nom de tables
    Par exemple pour quelques tables
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    SELECT DISTINCT
    	EU.CODE_RNE AS RNE_etablissement,
    	-- Remplacement des espaces vides par un tiret
    	REPLACE(MATABLE.ELEMENT_STRUCTURE.CODE_STRUCTURE,' ', '-') AS division_classe,
    	REPLACE(REPLACE(E.SEXE_ID, '2', 'ANGB2'), '1', 'ANGB2') AS Certif_Langue,
    	-- Remplacement des 1 (garçons) par M et des 2 (filles) par F
    	REPLACE(REPLACE(E.SEXE_ID, '1', 'M'), '2', 'F') AS civilite,
    	LTRIM(E.NOM_ELEVE) AS nom_famille,
    	E.NOM_USAGE_ELEVE AS nom_usage,
    	-- Concaténation des prénoms de l'élève dans 1 seule colonne avec séparateur espace vide ' '
    	COALESCE(E.PRENOM_ELEVE,'')||' '||
    	COALESCE(E.PRENOM2_ELEVE,'')||' '||
    	COALESCE(E.PRENOM3_ELEVE,'') as prenoms,
    	E.ID_NATIONAL AS ine,
    	REPLACE(E.PAYS_ID, '1', '100') AS pays_naissance,
    	-- Affichage de la date au format DD/MM/YYYY
    	TO_CHAR(E.DATE_NAISS_ELE, 'DD/MM/YYYY') AS date_naissance,
    	MATABLE.DEPT.CODE_DEPARTEMENT AS depCOM_naissance,
    	CI.CODE_COMMUNE_INSEE AS commune_naissance,
    	MATABLE.PAYS.CODE_PAYS AS nationalite,
    	REPLACE(A.PAYS_ID, '1', '100') AS pays_residence,
    	A.LIGNE1_ADRESSE AS adresse_1,
    	A.LIGNE2_ADRESSE AS adresse_2,
    	A.LIGNE3_ADRESSE AS adresse_3,
    	A.LIGNE4_ADRESSE AS adresse_4,
    	A.CODE_POSTAL AS code_postal,
    	A.LL_POSTAL AS localite,
    	E.TEL_PERSONNEL AS telephone,
    	E.EMAIL_ELEVE AS adresse_mail,
    	-- Remplacement des BTS et des TERMINALES 1BCGSEANG - 2BTNSEANG - 3BCPSEANG - 4BCGINTER
    	REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(M.CODE_MEF, '31131211220', 'BTS31211'), '31131209220', 'BTS31209'), '31131210220', 'BTS31210'), '3113121022A', 'BTS31210'), '31120008220', 'BTS20008'), '31133419220', 'BTS33419'), '31133414220', 'BTS334145'), '31133415220', 'BTS334145'), '31133420220', 'BTS33420'), '20211010112', 'BCGSEANG'), '20211011112', 'BCGSEANG'),'20212005112', 'BCGSEANG'), '20212005111', 'BCGSEANG'), '20213019112', 'BCGSEANG'), '21220006112', 'BTNSEANG'), '21220006117', 'BTNSEANG'), '2122000611M', 'BTNSEANG'),'21231017117', 'BTNSEANG'), '21231017112', 'BTNSEANG'), '2123101711M', 'BTNSEANG'),'21231018117', 'BTNSEANG'), '21231018112', 'BTNSEANG'), '2123101811M', 'BTNSEANG'),'2123100A11A', 'BTNSEANG'), '21231019112', 'BTNSEANG'), '21231019117', 'BTNSEANG'), '2123101911M', 'BTNSEANG'),'21233402112', 'BTNSEANG'), '24723004332', 'BTNSEANG'), '2472300A11A', 'BTNSEANG'),'24723005332', 'BCPSEANG'),'24723103332', 'BCPSEANG'), '24723103337', 'BCPSEANG'), '24723405332', 'BCPSEANG'), '24733403332', 'BCPSEANG'), '20211010111', 'BCGINTER'), '20213019111', 'BCGINTER') AS formation_suivie,
    	E.TEL_PORTABLE AS telephone_mobile
     
    FROM MATABLE.ELEVE as E
    INNER JOIN MATABLE.MEF as M ON (M.MEF_ID = E.MEF_ID)
    INNER JOIN MATABLE.OPTION_ELEVE as oe ON (OE.ELEVE_ID = E.ELEVE_ID)
    INNER JOIN MATABLE.MATIERE_ENSEIGNEE as ME ON (ME.MATIERE_ENSEIGNEE_ID = OE.MATIERE_ENSEIGNEE_ID)
    INNER JOIN MATABLE.ETAB_UAJ AS EU ON (E.ETAB_UAJ_ID = EU.ETAB_UAJ_ID)
    INNER JOIN MATABLE.COMMUNE_INSEE AS CI ON (E.COMMUNE_INSEE_ID = CI.COMMUNE_INSEE_ID)
    INNER JOIN MATABLE.DEPT ON (MATABLE.DEPT.DEPT_INSEE_ID = CI.DEPT_INSEE_ID)
    INNER JOIN MATABLE.PAYS ON (MATABLE.PAYS.PAYS_ID = E.PAYS_ID)
    INNER JOIN MATABLE.ELEVE_STRUCTURE ON (MATABLE.ELEVE_STRUCTURE.ELEVE_ID = E.ELEVE_ID)
    INNER JOIN MATABLE.ELEMENT_STRUCTURE ON (MATABLE.ELEMENT_STRUCTURE.STRUCTURE_ID = MATABLE.ELEVE_STRUCTURE.STRUCTURE_ID)
    INNER JOIN MATABLE.ELEVE_PERSONNE_ADRESSE ON (MATABLE.ELEVE_PERSONNE_ADRESSE.ELEVE_ID = E.ELEVE_ID)
    INNER JOIN MATABLE.PERSONNE as P ON (MATABLE.ELEVE_PERSONNE_ADRESSE.PERSONNE_ID = P.PERSONNE_ID)
    INNER JOIN MATABLE.ADRESSE  AS A ON (P.ADRESSE_ID = A.ADRESSE_ID)
     
    WHERE ( EU.CODE_RNE = '0010207M'
        OR  EU.CODE_RNE = '0010208P'
        OR  EU.CODE_RNE = '0010209K'
        OR  EU.CODE_RNE = '0110210B'
        OR  EU.CODE_RNE = '0110211W'
        OR  EU.CODE_RNE = '0410212V'
        OR  EU.CODE_RNE = '0410213N'
        OR  EU.CODE_RNE = '0410214P'
        OR  EU.CODE_RNE = '0410214E'
        OR  EU.CODE_RNE = '0410215M'
        OR  EU.CODE_RNE = '0410216U'
        OR  EU.CODE_RNE = '0610217J'
        OR  EU.CODE_RNE = '0610218C'
        OR  EU.CODE_RNE = '0610219D'
        OR  EU.CODE_RNE = '0610220V')
     
    OR (    M.CODE_MEF = '31131211220'
        OR  M.CODE_MEF = '31131209220'
        OR  M.CODE_MEF = '31131210220'
        OR  M.CODE_MEF = '31120008220'
        OR  M.CODE_MEF = '31133419220'
        OR  M.CODE_MEF = '31133414220'
        OR  M.CODE_MEF = '31133415220'
        OR  M.CODE_MEF = '31133420220'
        ))
     
    ORDER BY
        EU.CODE_RNE ASC ;
    Cordialement
    Soazig

  14. #14
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Salut,

    Merci pour ta réponse, euuhhhh du coup oui je ne vois plus pourquoi, en effet, je fais un "REPLACE(REPLACE(SCONET.ELEVE.SEXE_ID, '2', 'ANGB2'), '1', 'ANGB2') AS Certif_Langue," ????

    Je vais creuser la question .... Merci de la remarque !

    Pour la table avec deux colonnes et la jointure toute simple, comment dois-je faire stp ?

    Pour les alias oui je pensais en utilisé mais j'ai tellement de base et de schémas différents que je pense que je vais plutôt garder les noms complets pour m'y retrouver plus facilement, sachant que je vais gratter dans cette requête 5 fois par an, tu vois ce que je veux dire ? Lol

    Passe une bonne journée et merci encore pour ton aide.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour, en admettant que la table de correspondance s'appelle Correspondance, on obtient quelque chose comme ça.
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    SELECT DISTINCT
    	EU.CODE_RNE AS RNE_etablissement,
    	-- Remplacement des espaces vides par un tiret
    	REPLACE(MATABLE.ELEMENT_STRUCTURE.CODE_STRUCTURE,' ', '-') AS division_classe,
    	REPLACE(REPLACE(E.SEXE_ID, '2', 'ANGB2'), '1', 'ANGB2') AS Certif_Langue,
    	-- Remplacement des 1 (garçons) par M et des 2 (filles) par F
    	REPLACE(REPLACE(E.SEXE_ID, '1', 'M'), '2', 'F') AS civilite,
    	LTRIM(E.NOM_ELEVE) AS nom_famille,
    	E.NOM_USAGE_ELEVE AS nom_usage,
    	-- Concaténation des prénoms de l'élève dans 1 seule colonne avec séparateur espace vide ' '
    	COALESCE(E.PRENOM_ELEVE,'')||' '||
    	COALESCE(E.PRENOM2_ELEVE,'')||' '||
    	COALESCE(E.PRENOM3_ELEVE,'') as prenoms,
    	E.ID_NATIONAL AS ine,
    	REPLACE(E.PAYS_ID, '1', '100') AS pays_naissance,
    	-- Affichage de la date au format DD/MM/YYYY
    	TO_CHAR(E.DATE_NAISS_ELE, 'DD/MM/YYYY') AS date_naissance,
    	MATABLE.DEPT.CODE_DEPARTEMENT AS depCOM_naissance,
    	CI.CODE_COMMUNE_INSEE AS commune_naissance,
    	MATABLE.PAYS.CODE_PAYS AS nationalite,
    	REPLACE(A.PAYS_ID, '1', '100') AS pays_residence,
    	A.LIGNE1_ADRESSE AS adresse_1,
    	A.LIGNE2_ADRESSE AS adresse_2,
    	A.LIGNE3_ADRESSE AS adresse_3,
    	A.LIGNE4_ADRESSE AS adresse_4,
    	A.CODE_POSTAL AS code_postal,
    	A.LL_POSTAL AS localite,
    	E.TEL_PERSONNEL AS telephone,
    	E.EMAIL_ELEVE AS adresse_mail,
    	-- Remplacement des BTS et des TERMINALES 1BCGSEANG - 2BTNSEANG - 3BCPSEANG - 4BCGINTER
    	C.formation_suivie ,
    	E.TEL_PORTABLE AS telephone_mobile
     
    FROM MATABLE.ELEVE as E
    INNER JOIN MATABLE.MEF as M ON (M.MEF_ID = E.MEF_ID)
    Left outer join Correspondance C on (M.MEF_ID=C.MEF_ID)
    INNER JOIN MATABLE.OPTION_ELEVE as oe ON (OE.ELEVE_ID = E.ELEVE_ID)
    INNER JOIN MATABLE.MATIERE_ENSEIGNEE as ME ON (ME.MATIERE_ENSEIGNEE_ID = OE.MATIERE_ENSEIGNEE_ID)
    INNER JOIN MATABLE.ETAB_UAJ AS EU ON (E.ETAB_UAJ_ID = EU.ETAB_UAJ_ID)
    INNER JOIN MATABLE.COMMUNE_INSEE AS CI ON (E.COMMUNE_INSEE_ID = CI.COMMUNE_INSEE_ID)
    INNER JOIN MATABLE.DEPT ON (MATABLE.DEPT.DEPT_INSEE_ID = CI.DEPT_INSEE_ID)
    INNER JOIN MATABLE.PAYS ON (MATABLE.PAYS.PAYS_ID = E.PAYS_ID)
    INNER JOIN MATABLE.ELEVE_STRUCTURE ON (MATABLE.ELEVE_STRUCTURE.ELEVE_ID = E.ELEVE_ID)
    INNER JOIN MATABLE.ELEMENT_STRUCTURE ON (MATABLE.ELEMENT_STRUCTURE.STRUCTURE_ID = MATABLE.ELEVE_STRUCTURE.STRUCTURE_ID)
    INNER JOIN MATABLE.ELEVE_PERSONNE_ADRESSE ON (MATABLE.ELEVE_PERSONNE_ADRESSE.ELEVE_ID = E.ELEVE_ID)
    INNER JOIN MATABLE.PERSONNE as P ON (MATABLE.ELEVE_PERSONNE_ADRESSE.PERSONNE_ID = P.PERSONNE_ID)
    INNER JOIN MATABLE.ADRESSE  AS A ON (P.ADRESSE_ID = A.ADRESSE_ID)
     
    WHERE ( EU.CODE_RNE = '0010207M'
        OR  EU.CODE_RNE = '0010208P'
        OR  EU.CODE_RNE = '0010209K'
        OR  EU.CODE_RNE = '0110210B'
        OR  EU.CODE_RNE = '0110211W'
        OR  EU.CODE_RNE = '0410212V'
        OR  EU.CODE_RNE = '0410213N'
        OR  EU.CODE_RNE = '0410214P'
        OR  EU.CODE_RNE = '0410214E'
        OR  EU.CODE_RNE = '0410215M'
        OR  EU.CODE_RNE = '0410216U'
        OR  EU.CODE_RNE = '0610217J'
        OR  EU.CODE_RNE = '0610218C'
        OR  EU.CODE_RNE = '0610219D'
        OR  EU.CODE_RNE = '0610220V')
     
    OR (    M.CODE_MEF = '31131211220'
        OR  M.CODE_MEF = '31131209220'
        OR  M.CODE_MEF = '31131210220'
        OR  M.CODE_MEF = '31120008220'
        OR  M.CODE_MEF = '31133419220'
        OR  M.CODE_MEF = '31133414220'
        OR  M.CODE_MEF = '31133415220'
        OR  M.CODE_MEF = '31133420220'
        ))
     
    ORDER BY
        EU.CODE_RNE ASC ;
    Cordialement
    Soazig

  16. #16
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 1 443
    Points
    1 443
    Par défaut
    Tu peux aussi largement optimiser ta clause WHERE et la rendre plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WHERE (EU.CODE_RNE IN 
    ('0010207M','0010208P','0010209K','0110210B','0110211W','0410212V','0410213N','0410214P','0410214E','0410215M','0410216U','0610217J','0610218C','0610219D','0610220V'))
    OR (M.CODE_MEF IN 
    ('31131211220','31131209220','31131210220','31120008220','31133419220','31133414220','31133415220','31133420220'))
    Même là il serait sans doute plus judicieux d'avoir une table ou une requête qui te renvoie la liste de valeur, plus simple à maintenir que de les avoir en dur dans ta requête vu le nombre de valeur concernées (ce qui te permettrait au passage de les remplacer par un JOIN)

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Rebonjour,
    Citation Envoyé par virginieh
    Même là il serait sans doute plus judicieux d'avoir une table ou une requête qui te renvoie la liste de valeur
    Je suis d'accord, je ne l'avais pas mentionné car SQLpro l'avait déjà proposé
    Citation Envoyé par sqlpro
    6) pour votre WHERE avec ses deux multiples OR, vous devriez construire deux tables temporaires indexées et faire des jointures.
    Petite question à LudoV63,
    Citation Envoyé par LudoV63
    Je souhaiterais savoir s'il serait possible de simplifier cette requête ?
    Dans quel but, la performance ? la lisibilité ? autre.

    Quel est le but de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REPLACE(E.PAYS_ID, '1', '100') AS pays_naissance,
    Transformer le code pays 1 en 100 ? mais ça transforme aussi le pays 21 en 2100, ou le pays 213 en 21003, est-ce ce que tu veux faire ?
    Si ce n'est pas le cas utilise un case when.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REPLACE(REPLACE(E.SEXE_ID, '1', 'M'), '2', 'F') AS civilite,
    Vu qu'il y a un Sexe_id, j'imagine qu'il y a une table Sexe, et peut-être contient-elle une colonne contenant la correspondance F/M dans ce cas le transcodage peut se faire par une jointure supplémentaire sur la table Sexe.
    Accessoirement le nom de la colonne semble erroné, M, F n'est pas une civilité, M. Mme oui.
    Qu'as-tu réussi à faire à partir de nos suggestions ?
    Cordialement
    Soazig

  18. #18
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    A mon avis, les listes de valeurs CODE_MEF devraient être dans une table pour faire une jointure au lieu de 'OR' avec des valeurs en dur. Et la table contiendrait FORMATION_SUIVIE et du coup la jointure suffit à éviter tous ces replace().

    Citation Envoyé par SQLpro Voir le message
    1) la cosmétique n'a pas sa place dans une requête SQL. Supprimez toutes les concaténations cosmétique et donnez les valeurs brutes. Faite la cosmétique sur l'outil adapté (programme d'IHM).
    2) de même avec les REPLACE cosmétique (tiret par exemple)
    3) de même pour les RTRIM/LTRIM...
    4) de même pour le TO_CHAR de la date
    5) utilisez le CASE plutôt que des REPLACE de REPLACE
    Pour la présentation, oui, mais là il s'agit de manipulation de donnée qui doit être faite en SQL. Plus efficace car exécuté proche des données. Plus maintenable car language déclaratif. Par exemple, 1) c'est une règle métier sur les données, puisque avec un tiret CODE_STRUCTURE devient DIVISION_CLASSE. On pourrait même penser que cette transformation est utilisée par plusieurs requêtes, et donc avoir une vue qui montre DIVISION_CLASSE avec son tiret.

    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  19. #19
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Bonjour à toutes et tous !!!

    Tout d'abord merci à SOAZIG, VIRGINIEH et PACHOT ;-)

    SOAZIG : Dans quel but, la performance ? la lisibilité ? autre.
    --> Oui, la performance, la lisibilité, la simplification. Je suis loin d'être un dév expert ++ donc j'ai fais cette requête avec une collègue et nous souhaitions savoir s'il était possible de l'optimiser.

    SOAZIG : Transformer le code pays 1 en 100 ? mais ça transforme aussi le pays 21 en 2100, ou le pays 213 en 21003, est-ce ce que tu veux faire ?
    --> En fait les pays concernés par cette requête sont principalement la France (1) et l'Angleterre (25) donc ce n'est pas gênant de convertir 1 en 100. En fait c'est ce qui nous est demandé pour construire le CSV final, tout les résidents en France doivent avoir ce code 100 ... Je n'ai pas plus d'explication là-dessus.

    SQLPRO : 6) pour votre WHERE avec ses deux multiples OR, vous devriez construire deux tables temporaires indexées et faire des jointures.
    --> Nous sommes entrain de nous pencher sur cette façon de faire, mais nous avons eu d'autres priorités ces derniers jours.

    CEPENDANT nous avons pris note de toutes les remarques et propositions qui nous ont été faites et allons tâcher de les mettre en pratique !!! ;-) ce n'est pas tombé aux oubliettes.

    VIRGINIEH : Tu peux aussi largement optimiser ta clause WHERE et la rendre plus lisible
    --> Je vais le faire je pense que en effet ça va alléger la lecture du code.

    SOAZIG : en admettant que la table de correspondance s'appelle Correspondance, on obtient quelque chose comme ça.
    --> Je vais regarder ça aussi dès que l'urgent sera traité ;-)

    PACHOT : ..... Et la table contiendrait FORMATION_SUIVIE et du coup la jointure suffit à éviter tous ces replace().
    --> Alors j'ai tenté avec le CASE mais la seule chose que j'ai vraiment réussi à faire fonctionner sont les REPLACE de REPLACE de REPLACE ... Je sais ce n'est pas très glamour mais ça fonctionne super bien. Alors je dois avoir des erreurs ailleurs qui empêchent le bon fonctionnement du CASE ... :-(

    ***************

    Merci à tous en tout cas pour toutes vos remarques, je les gardes précieusement et dès que ça m'est possible je m'en occupe.

    @ très bientôt ;-) et merci encore !!!

  20. #20
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 729
    Points : 1 414
    Points
    1 414
    Par défaut
    En plus des remarques précédentes :
    Dans le SELECT
    -Utilisation de la fonction CONCAT_WS()
    -Utilisation de CASE

    Dans le FROM
    -voir si la présence des tables MATABLE.OPTION_ELEVE et MATABLE.MATIERE_ENSEIGNEE est requise
    --- du coup vérifier si le DISTINCT est nécessaire
    -Faire 'apparaitre' la table de dé-codification des formations

    Ce qui donne :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    SELECT DISTINCT
        EU.CODE_RNE                                                     AS RNE_etablissement,
        -- Remplacement des espaces vides par un tiret
        REPLACE(Element_S.CODE_STRUCTURE,' ', '-')                      AS division_classe,
        CASE E.SEXE_ID 
            WHEN '1' THEN 'ANGB2'
            WHEN '2' THEN 'ANGB2'
            ELSE E.SEXE_ID
            END)                                                        AS Certif_Langue,
        -- Remplacement des 1 (garçons) par M et des 2 (filles) par F
        CASE E.SEXE_ID
            WHEN '1' THEN 'M' -- 'M.' 
            WHEN '2' THEN 'F' -- 'Mme'
            ELSE E.SEXE_ID
            END                                                         AS civilite,
        LTRIM(E.NOM_ELEVE)                                              AS nom_famille,
        E.NOM_USAGE_ELEVE                                               AS nom_usage,
        -- Concaténation des prénoms de l'élève dans 1 seule colonne avec séparateur espace vide ' '
        CONCAT_WS(', ',E.PRENOM_ELEVE,E.PRENOM2_ELEVE,E.PRENOM3_ELEVE)  AS prenoms,
        E.ID_NATIONAL                                                   AS ine,
        CASE E.PAYS_ID when '1' then '100' else E.PAYS_ID end           AS pays_naissance,
        -- Affichage de la date au format DD/MM/YYYY
        TO_CHAR(E.DATE_NAISS_ELE, 'DD/MM/YYYY')                         AS date_naissance,
        D.CODE_DEPARTEMENT                                              AS depCOM_naissance,
        CI.CODE_COMMUNE_INSEE                                           AS commune_naissance,
        Pays.CODE_PAYS                                                  AS nationalite,
        CASE A.PAYS_ID when '1' then '100' else A.PAYS_ID end           AS pays_residence,
        A.LIGNE1_ADRESSE                                                AS adresse_1,
        A.LIGNE2_ADRESSE                                                AS adresse_2,
        A.LIGNE3_ADRESSE                                                AS adresse_3,
        A.LIGNE4_ADRESSE                                                AS adresse_4,
        A.CODE_POSTAL                                                   AS code_postal,
        A.LL_POSTAL                                                     AS localite,
        E.TEL_PERSONNEL                                                 AS telephone,
        E.EMAIL_ELEVE                                                   AS adresse_mail,
        -- Remplacement des BTS et des TERMINALES 1BCGSEANG - 2BTNSEANG - 3BCPSEANG - 4BCGINTER
        FORMATION.FORMATION_SUIVIE                                      AS formation_suivie,
        E.TEL_PORTABLE                                                  AS telephone_mobile
     
    FROM MATABLE.ELEVE                                                  AS E
    INNER JOIN MATABLE.MEF                                              AS M 
        ON (M.MEF_ID = E.MEF_ID)
    -- INNER JOIN MATABLE.OPTION_ELEVE as oe ON (OE.ELEVE_ID = E.ELEVE_ID)
    -- INNER JOIN MATABLE.MATIERE_ENSEIGNEE as ME ON (ME.MATIERE_ENSEIGNEE_ID = OE.MATIERE_ENSEIGNEE_ID)
    INNER JOIN MATABLE.ETAB_UAJ                                         AS EU 
        ON (E.ETAB_UAJ_ID = EU.ETAB_UAJ_ID)
    INNER JOIN MATABLE.PAYS                                             AS Pays 
        ON (Pays.PAYS_ID = E.PAYS_ID)   
    INNER JOIN MATABLE.COMMUNE_INSEE                                    AS CI 
        ON (E.COMMUNE_INSEE_ID = CI.COMMUNE_INSEE_ID)
        INNER JOIN MATABLE.DEPT                                             AS D 
            ON (D.DEPT_INSEE_ID = CI.DEPT_INSEE_ID)
    INNER JOIN MATABLE.ELEVE_STRUCTURE                                  AS ES 
        ON (ES.ELEVE_ID = E.ELEVE_ID)
        INNER JOIN MATABLE.ELEMENT_STRUCTURE                                AS Element_S
            ON (Element_S.STRUCTURE_ID = ES.STRUCTURE_ID)
    INNER JOIN MATABLE.ELEVE_PERSONNE_ADRESSE                           AS EPA
        ON (EPA.ELEVE_ID = E.ELEVE_ID)
        INNER JOIN MATABLE.PERSONNE                                         AS P 
            ON (EPA.PERSONNE_ID = P.PERSONNE_ID)
            INNER JOIN MATABLE.ADRESSE                                          AS A 
                ON (P.ADRESSE_ID = A.ADRESSE_ID)
    INNER JOIN (VAlUES  
                ('31131211220', 'BTS31211'), ('31131209220', 'BTS31209'),
                ('31131210220', 'BTS31210'), ('3113121022A', 'BTS31210'),
                ('31120008220', 'BTS20008'), ('31133419220', 'BTS33419'),
                ('31133414220', 'BTS334145'),('31133415220', 'BTS334145'),
                ('31133420220', 'BTS33420'), ('20211010112', 'BCGSEANG'),
                ('20211011112', 'BCGSEANG'), ('20212005112', 'BCGSEANG'),
                ('20212005111', 'BCGSEANG'), ('20213019112', 'BCGSEANG'),
                ('21220006112', 'BTNSEANG'), ('21220006117', 'BTNSEANG'), 
                ('2122000611M', 'BTNSEANG'), ('21231017117', 'BTNSEANG'),
                ('21231017112', 'BTNSEANG'), ('2123101711M', 'BTNSEANG'),
                ('21231018117', 'BTNSEANG'), ('21231018112', 'BTNSEANG'), 
                ('2123101811M', 'BTNSEANG'), ('2123100A11A', 'BTNSEANG'), 
                ('21231019112', 'BTNSEANG'), ('21231019117', 'BTNSEANG'), 
                ('2123101911M', 'BTNSEANG'), ('21233402112', 'BTNSEANG'), 
                ('24723004332', 'BTNSEANG'), ('2472300A11A', 'BTNSEANG'),
                ('24723005332', 'BCPSEANG'), ('24723103332', 'BCPSEANG'), 
                ('24723103337', 'BCPSEANG'), ('24723405332', 'BCPSEANG'), 
                ('24733403332', 'BCPSEANG'), ('20211010111', 'BCGINTER'), 
                ('20213019111', 'BCGINTER') 
                )                                                       AS FORMATION (CODE_MEF, FORMATION_SUIVIE)
        ON FORMATION.CODE_MEF = M.CODE_MEF
     
    WHERE 
    (
        EU.CODE_RNE IN ('0010207M','0010208P','0010209K','0110210B','0110211W'
                        ,'0410212V','0410213N','0410214P','0410214E','0410215M'
                        ,'0410216U','0610217J','0610218C','0610219D','0610220V')
        OR 
        M.CODE_MEF IN ('31131211220','31131209220','31131210220','31120008220'
                       ,'31133419220','31133414220','31133415220','31133420220')
    )
     
    ORDER BY
        EU.CODE_RNE ASC ;
    Je reste étonné de la clause WHERE par rapport au mode de jointure.
    Est-ce que les ELEVES qui ont une correspondance dans la table MEF en ont, forcément, aussi une dans la table ETAB_UAJ (et inversement) ?
    Le savoir est une nourriture qui exige des efforts.

Discussions similaires

  1. Simplification de requête
    Par Ludix_ dans le forum Langage SQL
    Réponses: 12
    Dernier message: 13/04/2012, 15h26
  2. Simplification de requêtes SQL
    Par XGuarden dans le forum VB.NET
    Réponses: 8
    Dernier message: 30/12/2010, 12h31
  3. Simplification de requête
    Par Louis-Guillaume Morand dans le forum SQL
    Réponses: 21
    Dernier message: 03/03/2008, 13h26
  4. simplification de requête
    Par GMI3 dans le forum Oracle
    Réponses: 3
    Dernier message: 03/05/2006, 15h47
  5. [Access] simplification de requètes.
    Par pmboutteau dans le forum Langage SQL
    Réponses: 14
    Dernier message: 02/02/2006, 10h04

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