Précédent   Forum des professionnels en informatique > Général Développement > Conception > Méthodes > Merise
Merise Systémique, Cycle projet (V, W), flux, traitements ... Avant de poster -> F.A.Q Merise
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/07/2011, 10h22   #1
Membre du Club
 
Inscription : juillet 2002
Messages : 154
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 154
Points : 40
Points : 40
Envoyer un message via MSN à foxrol
Par défaut Merise et cardinalité

Bonjour à tous

J'espères être dans la bonne section, si ce n'est le cas alors excusez-moi.

J'ai deux tables Table_1 et Table_2 comme indiqué ci_dessous:

Table_1 ------(1)Table_1.BELNR=(N)Table_2.BELNR ------- Table_2

J'aimerais donc savoir si lors de l'écriture de la jointure entre les deux tables, il faut utuliser:

Code sql :
1
2
3
4
5
 
SELECT * 
FROM Table_1.*
INNER JOIN Table_2
ON Table_1.BELNR=Table_2.BELNR

ou
Code sqL :
1
2
3
4
5
 
SELECT * 
FROM Table_1.*
LEFT JOIN Table_2
ON Table_1.BELNR=Table_2.BELNR

Donc en fait mon problème est de savoir quand on a une cardinalité
  • 1 (1)---(N) faut-il uttiliser un inner ou un join?
  • 2 (0)---(N) faut-il uttiliser un inner ou un join?
  • 3 (N)---(1) faut-il uttiliser un inner ou un join?
  • 4 (N)---(0) faut-il uttiliser un inner ou un join?

Merci d'avance.
foxrol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 10h52   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par foxrol Voir le message
J'ai deux tables Table_1 et Table_2 comme indiqué ci_dessous:

Table_1 ------(1)Table_1.BELNR=(N)Table_2.BELNR ------- Table_2
Déjà, au niveau du schéma conceptuel, on ne parle pas de tables mais d'entités ou, si on a la rigueur absolue de fsmrel, d'entités types.

Ensuite, j'ai du mal à comprendre votre schéma !
Correspond-il à ce MCD ?
entite_1 -1,1----association----0,n- entite_2

Citation:
J'aimerais donc savoir si lors de l'écriture de la jointure entre les deux tables, il faut utuliser:
Code :
1
2
3
4
SELECT * 
FROM Table_1.*
INNER JOIN Table_2
ON Table_1.BELNR=Table_2.BELNR
ou
Code :
1
2
3
4
SELECT * 
FROM Table_1.*
LEFT JOIN Table_2
ON Table_1.BELNR=Table_2.BELNR
Là, un tour dans les cours de SQLPro s'impose !
Notamment la partie sur les jointures.

Ce n'est pas FROM Table_1.* mais FROM Table_1.
De plus, il vaut mieux éviter la guerre des étoiles !

Citation:
Donc en fait mon problème est de savoir quand on a une cardinalité
  • 1 (1)---(N) faut-il uttiliser un inner ou un join?
  • 2 (0)---(N) faut-il uttiliser un inner ou un join?
  • 3 (N)---(1) faut-il uttiliser un inner ou un join?
  • 4 (N)---(0) faut-il uttiliser un inner ou un join?
INNER JOIN ou JOIN, c'est pareil ! INNER est facultatif dans l'écriture de la jointure.
Par contre, LEFT JOIN ou RIGHT JOIN sont différents de JOIN ou INNER JOIN : ce sont les jointures externes.

Quelles que soient les cardinalités, on peut avoir besoin d'une jointure interne ou externe dans la requête.
Exemple...

Règles de gestion :
1) Un projet est dirigé par une seule personne et une personne peut diriger plusieurs projets.
2) Une personne peut travailler sur plusieurs projets et un projet peut faire travailler plusieurs personnes.

MCD :
personne -0,n----diriger----1,1- projet
|--------------0,n----travailler----0,n---|

Tables :
personne (prs_id, prs_matricule, prs_nom, prs_prenom...)
projet (prj_id, prj_id_chef, prj_numero, prj_nom, prj_date_debut...)
prs_travailler_prj (ptp_id_personne, ptp_id_projet, ptp_date_debut, ptp_date_fin)

Requêtes :
1) Liste des projets et nom de leur chef de projet :
Code :
1
2
3
4
5
6
SELECT prj.prj_numero, prj.prj_nom AS nom_projet,
    prs.prs_nom AS nom_chef_projet, 
    prs.prs_prenom AS prenom_chef_projet
FROM projet prj
INNER JOIN personne prs ON prs.prs_id = prj.prj_id_chef
ORDER BY prj.prj_numero
=> Ici on aura une ligne par projet.

2) Liste des personnes affectées et à quel(s) projet(s) elles sont affectées :
Code :
1
2
3
4
5
6
SELECT prs.prs_nom, prs_prs_prenom,
    prj.prj_numero, prj.prj_nom AS nom_projet
FROM personne prs
INNER JOIN prs_travailler_prj ptp ON ptp.ptp_id_personne = prs.prs_id
    INNER JOIN projet prj ON prj.prj_id = ptp.ptp_id_projet
ORDER BY prs.prs_nom, prs_prs_prenom, prj.prj_numero
=> Ici on aura autant de lignes que dans la table prs_travailler_prj mais les personnes non affectées et les projets sans personnes affectées ne seront pas présentes.

3) Liste de toutes les personnes et projets auxquels elles sont affectées :
Code :
1
2
3
4
5
6
SELECT prs.prs_nom, prs_prs_prenom,
    prj.prj_numero, prj.prj_nom AS nom_projet
FROM personne prs
LEFT OUTER JOIN prs_travailler_prj ptp ON ptp.ptp_id_personne = prs.prs_id
    INNER JOIN projet prj ON prj.prj_id = ptp.ptp_id_projet
ORDER BY prs.prs_nom, prs_prs_prenom, prj.prj_numero
=> Ici on aura au moins une ligne par personne et pour celles qui ne sont pas affectées à au moins un projet, il y aura NULL dans la colonne nom_projet.

4) Liste de tous les projets et nombre de personnes affectées :
Code :
1
2
3
4
5
6
SELECT prj.prj_numero, prj.prj_nom AS nom_projet, 
    COUNT(ptp.*) AS nb_personnes_affectees_au_projet
FROM projet prj
LEFT OUTER JOIN prs_travailler_prj ptp ON ptp.ptp_id_projet = prj.prj_id
GROUP BY prj.prj_numero, prj.prj_nom
ORDER BY prj.prj_numero
=> Ici on aura une ligne par projet avec ou sans personne affectée.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h33.


 
 
 
 
Partenaires

Hébergement Web