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 :

Ajouter une jointure à ma requête


Sujet :

Langage SQL

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Ajouter une jointure à ma requête
    Salut tout le monde,

    J'ai trois tables dont voici plus d'informations :

    Table professeurs :

    Champ Type Null Défaut Commentaires
    ID bigint(20) Non
    MATRICULE_PROF varchar(10) Non
    NOM_PROF text Non
    PRENOM_PROF text Oui NULL
    Email_Prof varchar(50) Non
    Table cours :

    Champ Type Null Défaut Commentaires
    ID bigint(20) Non
    MNEMONIC varchar(100) Non
    NOM_ANNEE text Non
    NOM_COURS text Non
    ECTS double Non
    PONDERATION int(11) Non
    CLOTURE tinyint(4) Oui 0
    et enseigner :

    ID bigint(20) Non
    MATRICULE_PROF varchar(10) Non
    MNEMONIC varchar(100) Non
    Ce que je voudrais en fait, c'est récupérer le nom des années pour lequel le matricule 123456 donne cours.

    Le champ MNEMONIC contient le MNEMOIC (exemple ECO-54) et le matricule du Professeur qui donne ce cours.

    Donc première chose à faire, c'est de filtrer les matricule sur 123456.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM enseigner WHERE MATRICULE_PROF = 123456;
    Ensuite, je pense qu'il faut faire une jointure entre la requête ci-dessus et la table cours ?

    En plus de cela, il faudrait que le nom des année n'apparaissent qu'une seule fois (DISTINCT).

    Je vous remercie sincèrement d'avance pour votre aide très précieuse.

    beegees

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT
        c.NOM_ANNEE
    FROM
        enseigner e
        INNER JOIN cours c
          ON c.MNEMONIC = e.MNEMONIC
    WHERE
        e.MATRICULE_PROF = 123456;

  3. #3
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Bonjour,

    Faire des jointures sur des chaines de caractères est suicidaite en terme de performance. Un SGBD réalisant des jointures montre une dégradation des performences arrivant rapidement avec le temps.

    Ici ENSEIGNER devrait être ainsi :
    ID bigint(20) Non
    ID_PROF INT NOT NULL
    ID_COUR INT NOT NULL
    La requête de Waldar reste correcte mais sera simplement plus efficace.

    PS : on a pour convention de nommer les tables au singulier, en effet une entitée est un modèle, et représente une seule occurrence.

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par kazou Voir le message
    PS : on a pour convention de nommer les tables au singulier, en effet une entitée est un modèle, et représente une seule occurrence.
    Euh... ça se discute, comme dirait l'autre...

    Personnellement, j'ai tendance à nommer mes entités (dans le MCD donc) avec des noms au singulier (et les associations avec des verbes à l'infinitif) parce qu'elles sont issues de phrases en français du type : "Un professeur assure de un à plusieurs cours." ==> Professeur -1,n----Assurer----0,n- Cours

    Par contre, une table est pour moi un ensemble d'éléments donc je les nomme systématiquement au pluriel :
    Professeurs(P_Id, P_Nom, P_Prenom, ...) <== La table des professeurs

  5. #5
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    En effet les associations sont souvent un verbe à l'infinitif. Les entitées quant à elles, dépendent beaucoup en effet du choix de l'analyste. J'ai cependant remarqué que beaucoup utilisent le singulier, et de plus mon prof d'analyse m'a toujours tanné avec ceci . Je garde donc et conseille l'utilisation du singulier.
    Pour argumenter un peu, dans une entitée on défini la liste des propriété qu'une occurence contiendra, elle représente donc un seul tuple. Pour faire le paralelle, l'entité est à la table ce que la classe est à l'instance. On a un "modèle" et on en cré une multitute d'instances (ou d'occurences).

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 116
    Points : 31 619
    Points
    31 619
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par CinePhil
    une table est pour moi un ensemble d'éléments donc je les nomme systématiquement au pluriel
    Et une colonne de la table représente aussi un ensemble d’éléments, donc si je vous suis, son nom devrait lui aussi être au pluriel.
    Par ailleurs, pour prolonger ce que dit kazou, une entité-type représente un ensemble d’éléments appelés occurrences, donc pourquoi ne pas mettre au pluriel un nom d’entité-type ?

    Il est prudent de suivre le père du Modèle Relationnel de Données, Ted Codd, qui a toujours utilisé le singulier (voyez son article fondateur).

    De façon générale, les théoriciens du relationnel tels que Ronald Fagin se contentent de lettres (P, Q, R, S, etc.) pour nommer les tables.
    Quand ils utilisent des noms (je fais référence à Carlo Zaniolo, Chris Date, Claude Delobel, etc.) c'est au singulier, mais il y a des exceptions : ainsi, le Professeur Gardarin utilise soit le singulier, soit le pluriel (Bases de données. Les systèmes et leurs langages. Eyrolles, 1988). Même chose concernant Jeffrey Ullman (Principles of DATABASE SYSTEMS, Second Edition. Computer Science Press. 1982). Par ailleurs, Bernard Maier utilise des noms au pluriel...

    Rien n’interdit donc a priori de mettre au pluriel un nom de table, mais je pense qu’il faut s’inspirer de la rigueur de Chris Date quand il passe au plan sémantique et qu'il fait le distinguo entre relvar (abréviation de variable relationnelle) et relation : une variable se situe dans le temps (et dans l’espace) et prend successivement des valeurs distinctes, à savoir des relations, lesquelles ne se situent ni dans le temps ni dans l’espace, au même titre que les nombres 1, 2, 3, etc. Dans le même sens, on pourrait très bien utiliser les termes tablevar et table pour signifier qu'une variable tabulaire prend des valeurs qui sont des tables.
    Dans ces conditions, à un instant donné, une tablevar prend une valeur unique. Pourquoi alors ne pas utiliser le singulier pour la tablevar lors de sa définition : "CREATE TABLE Professeur (...) ;" ? On peut considérer que les lignes de la table sont certes des valeurs, mais à un niveau interne et ne sont pas parties prenantes dans cette affaire.

    Et puis, d’un point de vue pragmatique, quand vous produisez un MCD comportant des centaines d’entités-types et d’associations-types, vous passez par les services d’un AGL, notamment pour dériver ce MCD en MLD. Je ne vois pas bien alors l’intérêt de reprendre les tablevars produites, pour les renommer une à une, tâche ingrate et déprimante s’il en est.


    Citation Envoyé par CinePhil
    j'ai tendance à nommer mes entités (dans le MCD donc) avec des noms au singulier (et les associations avec des verbes à l'infinitif) parce qu'elles sont issues de phrases en français du type : "Un professeur assure de un à plusieurs cours." ==> Professeur -1,n----Assurer----0,n- Cours
    Toujours à la suite de Chis Date on convient que, tout comme une relvar, une relation est composée d’un en-tête et un corps.
    L’en-tête (encore appelé schéma) est un énoncé vérifonctionnel, un prédicat à n places, ces dernières étant représentées par les attributs composant l’en-tête.

    Exemple beegeesien :

    En-tête de la relvar Professeur :
    Professeur (MatriculeProf, NomProf, PrenomProf, EmailProf)
    Prédicat :
    Le professeur ayant pour matricule MatriculeProf, nommé NomProf et prénommé PrenomProf a pour adresse de courriel EmailProf.
    Le corps est composé des lignes de la relation qui est la valeur actuelle de la relvar, et ces lignes correspondent aux propositions qui instancient le prédicat :
    Le professeur ayant pour matricule 1234, nommé Gismow et prénommé Louis a pour adresse de courriel louis.gismow@dvp.be
    Le professeur ayant pour matricule 4567, nommé Spielberg et prénommé Albert a pour adresse de courriel albert.spielberg@dvp.be
    Le professeur ayant pour matricule 7890, nommé King et prénommé Marc a pour adresse de courriel marc.king@dvp.be

    Bref, toutes choses égales par ailleurs, quant au singulier et au pluriel les noms, ce qui vaut pour les entités-types du MCD vaut également pour les relvars et tablevars.

  7. #7
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT
        c.NOM_ANNEE
    FROM
        enseigner e
        INNER JOIN cours c
          ON c.MNEMONIC = e.MNEMONIC
    WHERE
        e.MATRICULE_PROF = 123456;
    Citation Envoyé par kazou Voir le message
    Bonjour,

    Faire des jointures sur des chaines de caractères est suicidaite en terme de performance. Un SGBD réalisant des jointures montre une dégradation des performences arrivant rapidement avec le temps.

    Ici ENSEIGNER devrait être ainsi :


    La requête de Waldar reste correcte mais sera simplement plus efficace.

    PS : on a pour convention de nommer les tables au singulier, en effet une entitée est un modèle, et représente une seule occurrence.
    Citation Envoyé par CinePhil Voir le message
    Euh... ça se discute, comme dirait l'autre...

    Personnellement, j'ai tendance à nommer mes entités (dans le MCD donc) avec des noms au singulier (et les associations avec des verbes à l'infinitif) parce qu'elles sont issues de phrases en français du type : "Un professeur assure de un à plusieurs cours." ==> Professeur -1,n----Assurer----0,n- Cours

    Par contre, une table est pour moi un ensemble d'éléments donc je les nomme systématiquement au pluriel :
    Professeurs(P_Id, P_Nom, P_Prenom, ...) <== La table des professeurs
    Citation Envoyé par kazou Voir le message
    En effet les associations sont souvent un verbe à l'infinitif. Les entitées quant à elles, dépendent beaucoup en effet du choix de l'analyste. J'ai cependant remarqué que beaucoup utilisent le singulier, et de plus mon prof d'analyse m'a toujours tanné avec ceci . Je garde donc et conseille l'utilisation du singulier.
    Pour argumenter un peu, dans une entitée on défini la liste des propriété qu'une occurence contiendra, elle représente donc un seul tuple. Pour faire le paralelle, l'entité est à la table ce que la classe est à l'instance. On a un "modèle" et on en cré une multitute d'instances (ou d'occurences).
    Citation Envoyé par fsmrel Voir le message
    Et une colonne de la table représente aussi un ensemble d’éléments, donc si je vous suis, son nom devrait lui aussi être au pluriel.
    Par ailleurs, pour prolonger ce que dit kazou, une entité-type représente un ensemble d’éléments appelés occurrences, donc pourquoi ne pas mettre au pluriel un nom d’entité-type ?

    Il est prudent de suivre le père du Modèle Relationnel de Données, Ted Codd, qui a toujours utilisé le singulier (voyez son article fondateur).

    De façon générale, les théoriciens du relationnel tels que Ronald Fagin se contentent de lettres (P, Q, R, S, etc.) pour nommer les tables.
    Quand ils utilisent des noms (je fais référence à Carlo Zaniolo, Chris Date, Claude Delobel, etc.) c'est au singulier, mais il y a des exceptions : ainsi, le Professeur Gardarin utilise soit le singulier, soit le pluriel (Bases de données. Les systèmes et leurs langages. Eyrolles, 1988). Même chose concernant Jeffrey Ullman (Principles of DATABASE SYSTEMS, Second Edition. Computer Science Press. 1982). Par ailleurs, Bernard Maier utilise des noms au pluriel...

    Rien n’interdit donc a priori de mettre au pluriel un nom de table, mais je pense qu’il faut s’inspirer de la rigueur de Chris Date quand il passe au plan sémantique et qu'il fait le distinguo entre relvar (abréviation de variable relationnelle) et relation : une variable se situe dans le temps (et dans l’espace) et prend successivement des valeurs distinctes, à savoir des relations, lesquelles ne se situent ni dans le temps ni dans l’espace, au même titre que les nombres 1, 2, 3, etc. Dans le même sens, on pourrait très bien utiliser les termes tablevar et table pour signifier qu'une variable tabulaire prend des valeurs qui sont des tables.
    Dans ces conditions, à un instant donné, une tablevar prend une valeur unique. Pourquoi alors ne pas utiliser le singulier pour la tablevar lors de sa définition : "CREATE TABLE Professeur (...) ;" ? On peut considérer que les lignes de la table sont certes des valeurs, mais à un niveau interne et ne sont pas parties prenantes dans cette affaire.

    Et puis, d’un point de vue pragmatique, quand vous produisez un MCD comportant des centaines d’entités-types et d’associations-types, vous passez par les services d’un AGL, notamment pour dériver ce MCD en MLD. Je ne vois pas bien alors l’intérêt de reprendre les tablevars produites, pour les renommer une à une, tâche ingrate et déprimante s’il en est.



    Toujours à la suite de Chis Date on convient que, tout comme une relvar, une relation est composée d’un en-tête et un corps.
    L’en-tête (encore appelé schéma) est un énoncé vérifonctionnel, un prédicat à n places, ces dernières étant représentées par les attributs composant l’en-tête.

    Exemple beegeesien :

    En-tête de la relvar Professeur :
    Professeur (MatriculeProf, NomProf, PrenomProf, EmailProf)
    Prédicat :
    Le professeur ayant pour matricule MatriculeProf, nommé NomProf et prénommé PrenomProf a pour adresse de courriel EmailProf.
    Le corps est composé des lignes de la relation qui est la valeur actuelle de la relvar, et ces lignes correspondent aux propositions qui instancient le prédicat :
    Le professeur ayant pour matricule 1234, nommé Gismow et prénommé Louis a pour adresse de courriel louis.gismow@dvp.be
    Le professeur ayant pour matricule 4567, nommé Spielberg et prénommé Albert a pour adresse de courriel albert.spielberg@dvp.be
    Le professeur ayant pour matricule 7890, nommé King et prénommé Marc a pour adresse de courriel marc.king@dvp.be

    Bref, toutes choses égales par ailleurs, quant au singulier et au pluriel les noms, ce qui vaut pour les entités-types du MCD vaut également pour les relvars et tablevars.
    Bonjour à tous,

    Un tout GRAND merci pour vos réponses qui sont vraiment très complètes.

    Le code fourni dans le premier post fonctionne très bien.

    Je vais relire attentivement et à mon aise les autres réponses.

    Fsmrel, heureux de vous parler à nouveau

    Encore un tout grand merci à tous.

    beegees

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] faire une jointure sur requête
    Par lolocdm dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/02/2015, 15h54
  2. [SP-2010] Ajouter une colonne : Webpart Requête de contenu
    Par sebfreu dans le forum SharePoint
    Réponses: 2
    Dernier message: 31/01/2012, 19h10
  3. ajouter une contrainte à ma requête
    Par alienor50 dans le forum Requêtes
    Réponses: 7
    Dernier message: 06/06/2011, 10h46
  4. Réponses: 2
    Dernier message: 12/01/2008, 15h57
  5. Remplacer une jointure dans une requête DELETE
    Par lorant dans le forum Requêtes
    Réponses: 5
    Dernier message: 30/11/2006, 20h46

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