Bonjour,
J'espere qu'une personne pourra eclairer ma lanterne.
Bien que comprenant ceratins principes de base au sujets des bases de donnees relationnelles et de SQL (ainsi que de l'algebre lineaire), je n'ai jamais reussi a comprendre comment:
1) Traduire, en utilisant une methodologie que je recherche, une question exprimee en langage naturel en une requete SQL
2) Savoir quand utiliser une jointure ou bien alors une sous-requete ou une combinaison
J'arrive a ecrire des requetes sur plusieurs tables mais parfois c'est plus de la "magie" que de la science et bien que la magie soit une activite interessante a plusieurs niveaux ce n'est pas vraiment sa place dans une application informatique. Et parfois cela ne donne pas le resultat escompte ! (voir exemple en fin de message).
Pourriez-vous m'aider?
Merci par avance pour tout effort qui sera apprecie de toute facon.
Jean-Michel.
Exemple de probleme:
Table Propriete (PropId, PropAdresse, TypeBatId)
Table TypeBatiment (TypeBatId, TypeBatDesc)
Table ProprieteSinistres (PropSinId, PropId, SinDate)
Table Sinistre(SinDate, SinHeure)
Table ProprieteSinistresSources(PropSinId, SinSourceId)
Table SinistreSource(SinSourceId, SinSourceDesc)
Donc un enregistrement de la table Propriete peut avoir subi plusieurs sinistres, donc relie a plusieurs enregistrements de la table ProprieteSinistres.
La table ProprieteSinistres est reliee a la table Propriete par la cle etrangere PropId.
Un enregistrement de la table ProprieteSinistres est relie a un enregistrement de la table Sinistre par la cle etrangere SinDate.
Un meme sinistre pour une propriete specifiee, peut avoir eu plusieurs sources.
Exemple dans le cas d'une inondation l'eau peut venir en meme temps d'une riviere, etre remontee depuis le sol et avoir debordee des egouts.
Ceci est enregistrer par l'intermediaire de la table ProprieteSinistresSources.
La table TypeBatiment a ete cree de facon a pouvoir changer en une seule fois un type de batiment un peu a la maniere d'utilisation d'une variable dans un programme a la place d'une valeur "en dur".
Un enregistrement de la table Sinistre peut avoir "touche" plusieurs propriete, ceci est enregistrer dans la table ProprieteSinistres.
Le but est d'enregistrer tous les sinistres et toutes leurs sources pour toutes
les proprietes et de pouvoir faire des requetes variees sur ces informations/donnees.
J'ai donc construit une requete comme celle-ci (la requete finale implique encore plus de tables que les cinq donnees en exemple) qui en fait se termine par un produit cartesien ce qui n'est pas le but recherche.
La question est:
Lister toutes les proprietes touchees par un sinistre dont la date est specifiee en indiquant la date et l'heure du sinistre, l'adresse, le type de propriete ainsi que toutes les sources du sinistre pour chacune des proprietes.
Ma requete, qui donne un produit cartesien:
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 SELECT Sinistre.SinDate, Sinistre.SinHeure, Propriete.PropAdresse, TypeBatiment.TypBatDesc, SinistreSource.SinSourceDesc FROM ( ( TypeBatiment INNER JOIN Propriete ON TypeBatiment TypeBatId=Propriete.TypeBatId ) INNER JOIN ProprieteSinistres ON Propriete.PropId=ProprieteSinistres.PropId ) INNER JOIN ( SinistreSource INNER JOIN ProprieteSinistresSources ON SinistreSource.SinSourceId=ProprieteSinistresSources.SinSourceId ) ON ProprieteSinistresSources.SinDate=Sinistres.SinDate WHERE Sinistres.SinDate=x Order By Sinistre.SinDate, Sinistre.SinHeure, Propriete.PropAdresse, TypeBatiment.TypBatDesc, SinistreSource.SinSourceDesc ;



Répondre avec citation








)










Partager