Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 14/08/2013 14:08:49
- Thomas Williamson
- Membre
Conseils requête
Bonjour,
Tout d'abord, désolé pour le sujet du message : j'avoue avoir beaucoup peiné à trouver un titre résumant ma problématique... Si quelqu'un a une idée , lâchez-vous !
Voilà mon cas :
Je dispose d'une table operation_reseau reliée à 5 tables : geo_1, geo_2, geo_3, geo_4 et geo_5 avec les structures suivantes :
- operation_reseau (ope_id, ope_date, ope_commune, ope_commentaire)
- geo_1(gid, matricule, longueur, ope_id)
- geo_2(gid, matricule, longueur, ope_id)
- geo_3(gid, matricule, longueur, ope_id)
- geo_4(gid, matricule, longueur, ope_id)
- geo_5(gid, matricule, longueur, ope_id)
Le principe est que je peux avoir plusieurs enregistrements dans une table geo_x correspondant à un unique enregistrement dans la table operation_reseau (relation 1 - n). Deuxième point important : un enregistrement de la table operation_reseau ne peut faire référence qu'à une seule table geo_x.
Je souhaite écrire une requête qui me permette de mettre en forme un tableau du genre :
ope_id | Table geo | Nombre d'enregistrements
------------------------------------------------------------------------
1 | geo_1 | 3
2 | geo_3 | 1
3 | geo_2 | 8
4 | geo_5 | 2
> Par exemple : l'enregistrement de la table operation_reseau dont ope_id = 1 fait référence à 3 enregistrements de la table geo_1.
Le souci est qu'il faudrait que je réussisse à détecter à quelle table geo_x un enregistrement donné de la table operation_reseau fait référence, puis à rapatrier le nom de la table dans la colonne Table geo de ma requête. J'ai déjà un bout de script mais le problème est que je ne tape que dans la table geo_1 et je ne récupère pas son nom :
SELECT a.ope_id, COUNT(geo_1.gid) AS "Nombre d'enregistrements"
FROM operation_reseau a
LEFT JOIN geo_1 b ON a.gid = b.ope_id
GROUP BY a.ope_id ;
Quelqu'un pourrait-il m'aider à compléter le script ?
Merci beaucoup d'avance,
Thomas
Dernière modification par Thomas Williamson (14/08/2013 14:10:09)
Hors ligne
#2 14/08/2013 14:51:25
- arthurr
- Membre
Re : Conseils requête
pour moi il y a un pbs de conception, mais peut être que je ne comprends pas assez bien ton problème ...
J’aurai fait 3 tables :
- operation_reseau(operation_reseau_id(PK), ...)
- geo(geo_id(PK), type_geo_id(FK), operation_reseau_id(FK), ...)
- type_geo(type_geo_id(PK), num_geo, ...)
avec dans la colonne num_geo de la table type_geo les X des tables geo_X (1,2,3,4, ...)
C'est à mon avis bcp plus simple par la suite pour faire tes comptages.
Concernant tes contraintes (un operation_reseau_id pour un seul type_geo_id, mais avec N lignes possibles) -> vérification à faire par trigger BEFORE INSERT, UPDATE
Hors ligne
#3 28/08/2013 17:02:42
- SQLpro
- Membre
Re : Conseils requête
Effectivement problème e conception gravissime ce qui se traduit par :
1) difficulté d'écrire des requêtes. D'où votre post...
2) performances dégradées...
Revoyez votre modèle pour un vrai MCD conforme à la normalisation et vous verrez que vous n'aurez plus de question à vous poser sur l'écriture des requêtes !
A +
Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES, Expert langage SQL
Le site sur les SGBD relationnel et langage SQL : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA, ISEN Toulon, CESI Aix en Provence * * * * *
Hors ligne
#4 29/08/2013 10:43:14
- Thomas Williamson
- Membre
Re : Conseils requête
Bonjour,
Merci pour vos réponses. Merde alors, j'avais pourtant passé du temps sur la modélisation... Pour éclaircir un peu le sujet, je joins les liens vers le MCD (avec les cardinalités) et le modèle relationnel qui en découle (l'utilisation des balises img avec ces adresses ne marchent pas...). Je ne comprends pas bien la table intermédiaire geo dont parle arthurr puisque les cardinalités (1,1) n'impliquent pas la création de ce type de table, mais seulement d'une clé étrangère dans les tables geo_x. J'espère que ces schémas peuvent vous aider à me dire ce qui cloche.
Merci encore pour votre aide !
Thomas
Hors ligne
#5 29/08/2013 17:17:07
- SQLpro
- Membre
Re : Conseils requête
Dans votre CMD vous devez placer des verbes dans vos associations.... a, b, c, d, e, f ne veut rien dire.
Un MCD montre la sémantique d'articulation des entités informationnelles entres elles; Sans verbe, aucun intérêt !
1) si des entités portent les mêmes noms à un détail près (ici N allant de 1 à 6) et les mêmes colonnes, alors il y a certainement un défaut de conception
2) si en outre, la sémantique et la cardinalité des associations envers ces mêmes entités similaires, alors il y a un autre défaut de conception.
En tout état de cause vous n'avez effectivement besoij que d'une seule entité de nom geo, comportant en sus une colonne "geo_n" dont le domaine irait de 1 à 5 et est à rajouter à la clef de votre entité comportant déjà la colonne geo_gid.
Voter seule association entre geo et opération_reseau gardant la même, cardinalité.
Et rien ne vous empêche de rajouter à votre base les vues geo1, geo2, geo3 construite sur le modèle suivant :
CREATE VIEW V_geo_1
AS
SELECT geo_gid, geo_matricule, geo_longueur, ope_id
FROM geo
WHERE geo_n = 1
Lisez UML pour SQL aux éditions Eyrolles, un ouvrage consacré à la modélisation des bases de données co écrit par mon collègue Christian Soutou et moi même...
A +
Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES, Expert langage SQL
Le site sur les SGBD relationnel et langage SQL : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA, ISEN Toulon, CESI Aix en Provence * * * * *
Hors ligne
Pages : 1