|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Bonjour,
je suis sous SQL Server 2005, je dois réaliser une vue SQL et j'avoue que j'ai énormément de problèmes pour la faire. J'ai trois tables : - table Carte avec une pk carte_ID - table Limitation qui est liée à une seule carte et qui a au max quatre règles, pk limitation_ID avec le carte_ID de renseigné et le regle_ID aussi et un champ limitation_valeur - table Règle qui est liée à une ou plusieurs limitations, pk regle_ID Ce que je veux c'est récupérer pour une carte toutes les valeurs des limitations, même si elle n'a pas de règles associées. Plus facile à dire qu'à faire (pour moi !). Le soucis se situe à un niveau particuliers, on définit 4 règles (R1, R2, R3, R4) : pour une carte qui n'utilise que 3 règles (R1, R2, R3) sur les 4, je veux récupérer les 3 limitations_valeurs, mais aussi NULL pour la règle (R4) qui n'est pas utilisée par la carte, donc en base il n'y a pas de limitation avec regle_ID R4 et la carte... J'ai beau essayé de faire des jointures externes, je n'y arrive pas. Le résultat que j'aimerais avoir est le suivant : carte_ID | limitation_ID | limitation_valeur | regle_ID 1 | 1 | 0.5 | 1 1 | 2 | 0.75 | 2 1 | 3 | 1 | 3 1 | NULL | NULL | 4 Et ce, pour l'ensemble des cartes. Je ne sais pas si je suis très clair... En tout cas merci à ceux qui pourront m'aider. |
|
|
00
|
|
|
#2 |
![]() ![]() |
Tu peux nous montrer la requête que tu as essayé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 ! |
|
00
|
|
|
#3 | ||
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Merci de regarder mon problème, voici la requête en cours, mais je ne suis carrément pas fier...
Code :
Avec cette requête dans le deuxième "case" au niveau de T4.regle_libelle et T4.limitation_valeur je n'ai pas les valeurs de ma 4e règle, mais les valeurs de T3. |
||
|
|
00
|
|
|
#4 | |||
![]() ![]() |
Citation:
Code :
__________________
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 ! |
|||
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Merci de ta solution,
mais ce n'est pas exactement cela que je veux, en effet avec la requête que tu as mis je récupère bien toutes les données, mais il me manque ma ligne pour ma règle 4. Voici ce que j'ai pour l'ensemble de mes cartes avec ta requête : carte_ID | regle_ID | limitation_ID | limitation_valeur 37 | 1 | 1 | -1 37 | 2 | 2 | 0 37 | 3 | 3 | 0 38 | 1 | 4 | 0,5 38 | 2 | 5 | 5 38 | 3 | 6 | 1 Et il faudrait que je recupere : carte_ID | regle_ID | limitation_ID | limitation_valeur 37 | 1 | 1 | -1 37 | 2 | 2 | 0 37 | 3 | 3 | 0 37 | 4 | NULL | NULL 38 | 1 | 4 | 0,5 38 | 2 | 5 | 5 38 | 3 | 6 | 1 38 | 4 | NULL | NULL Donc j'ai 4 règles de définis en base, mais mes cartes en utilise que trois, il me faut absolument récupérer les infos NULL pour la règle 4. |
|
|
00
|
|
|
#6 | ||
![]() ![]() |
Au temps pour moi ! Il faut déporter la condition de restriction du WHERE vers la condition de jointure puisqu'elle porte sur la table de droite, comme je l'explique dans mon blog !
Code :
Tu veux une restriction sur les cartes ou tu les veux toutes ?
__________________
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 ! |
||
|
00
|
|
|
#7 | ||
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Merci beaucoup,
en effet, on se rapproche du résultat que j'aimerais avoir, j'ai encore un petit soucis. J'ai modifié la requête pour qu'elle puisse me retourner également le numéro de la carte, et ce, pour l'ensemble des cartes : Code :
carte_ID | regle_ID | limitation_ID | limitation_valeur NULL | 4 | NULL | NULL Et il me faudrait carte_ID | regle_ID | limitation_ID | limitation_valeur 37 | 4 | NULL | NULL 38 | 4 | NULL | NULL ... |
||
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Essaie ceci : Code sql :
Tu peux aussi remplacer la pseudo table ListLim par un requete distinct dans ta table limitation, voire mieux, avoir une vraie table avec la liste exhaustive des limitations possibles (table que tu as surement déjà ?!? ) |
||
|
|
00
|
|
|
#9 |
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Bonjour aieeeuuuuu et merci à toi aussi.
Seulement le résultat est un peu différent de ce que je veux : carte_ID | regle_ID | limitation_ID | limitation_valeur 37 1 1 -1 NULL 1 NULL NULL NULL 1 NULL NULL 38 1 4 0,5 NULL 2 NULL NULL 37 2 2 0 NULL 2 NULL NULL NULL 2 NULL NULL NULL 3 NULL NULL NULL 3 NULL NULL 37 3 3 0 En effet, j'ai une table qui contient la liste de toutes les limitations possibles pour une liste déroulante, c'est la valeur qu'il y a dans le champ limitation_valeur |
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Arff, en effet, je suis allé un peu vite, et j'ai pris le problème a l'envers. Ce n'est pas les limitations qui sont parfois absentes, mais les règles
Donc : Code sql :
|
||
|
|
00
|
|
|
#11 |
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Super aieeeuuuuu !
Merci, c'est exactement ce dont j'avais besoin ! |
|
|
00
|
|
|
#12 | ||||
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Arf !
J'ai été un peu trop rapide. En fait, il y a un toujours un soucis, la solution proposée n'est pas dynamique. En effet, si j'ajoute une 5e règle, et une 6e, et une 7e... Et ainsi de suite jusqu'à la Xe règle, la solution proposée ne marche plus vu qu'avec cette partie : Code :
En gros, ma carte peut avoir 3 limitations de définies, avec la règle d'id 17, la règle d'id 35, et la règle d'id 999. Et dans ce cas, il faudrait faire : Code :
|
||||
|
|
00
|
|
|
#13 | ||
![]() ![]() |
Et comme ça ?
Code :
__________________
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 ! |
||
|
00
|
|
|
#14 |
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Merci aussi pour cette solution, mais elle ne fonctionne pas pour moi non plus.
Je récupère ces informations : carte_ID | regle_ID | limitation_ID | limitation_valeur NULL 4 NULL NULL 37 5 33998 1 37 1 1 -1 37 2 2 0 37 3 3 0 38 1 4 0,5 38 2 5 5 38 3 6 1 Je me rends compte que je vous ai induite en erreur avec mes "tableaux" il ne s'agit pas de regle_ID mais du numéro de la règle utilisée, sachant que j'en ai 4 au maximum. Le vrai tableau serait carte_ID | NUMERO DE REGLE | regle_ID | limitation_ID | limitation_valeur 37 1 1 1 -1 37 2 2 2 0 37 3 3 3 0 37 4 NULL NULL 38 1 1 4 0,5 38 2 2 5 5 38 3 3 6 1 38 4 5 "Limitation_ID" "une valeur" Dans cet exemple, la carte 38, a dans la 4e règle, la règle d'identifiant 5. Excusez moi pour cette erreur. |
|
|
00
|
|
|
#15 |
![]() ![]() |
Vous nous dites ce que vous voulez obtenir, mais sauf erreur vous ne donnez pas les données de départ, donc au final, ça ne permet pas de faire un bon test.
Si le jeu initial est trop volumineux pour être lisible sur le forum, il suffit de le réduire aux différents cas de figures possibles : et ce de façon exhaustive.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#16 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
Code sql :
|
|||
|
|
10
|
|
|
#17 |
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Merci de votre remarque Waldar.
Voici mon jeu de données pour deux cartes 37 et 38. La table carte avec une colonne carte_ID (il y a d'autres colonnes mais à but information, des dates) La table Limitation voici les informations : Limitation_ID | Limitation_valeur | Carte_ID | Regle_ID 1 -1 37 1 2 0 37 2 3 0 37 3 4 0,5 38 1 5 5 38 2 6 1 38 3 33998 1 37 5 La table Regle avec un colonne regle_ID (comme pour les cartes avec des colonnes dates en plus) : 1,2,3,4,5 |
|
|
00
|
|
|
#18 |
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Oui aieeeuuuuu, j'avais pensé à ça après, mais comme je l'explique un peu plus haut, je me suis mal exprimé sur le règle_ID, en fait c'est vraiment :
carte_ID | NUMERO DE REGLE | regle_ID | limitation_ID | limitation_valeur 37 1 1 1 -1 37 2 2 2 0 37 3 3 3 0 37 4 NULL NULL 38 1 1 4 0,5 38 2 2 5 5 38 3 3 6 1 38 4 5 "Limitation_ID" "une valeur" Que j'aimerais avoir. Et la solution que vous me proposez me retourne : carte_ID | regle_ID | limitation_ID | limitation_valeur 37 1 1 -1 37 2 2 0 37 3 3 0 37 5 33998 1 37 4 NULL NULL 38 1 4 0,5 38 2 5 5 38 3 6 1 38 4 NULL NULL 38 5 NULL NULL Désolé |
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
et d'ou provient le "numéro de regle" ? de la table regle ? dans ce cas faites la jointure dessus au lieu de la faire sur l'ID
|
|
|
00
|
|
|
#20 |
|
Membre du Club
![]() Inscription : mai 2006 Messages : 175 ![]() |
Le numéro de règle c'est juste un numéro "d'emplacement" qui n'a pas d'existence propre en base.
En fait grâce à cette vue, j'utilise une procédure stockée pour concaténer les différentes valeurs : la limitation_valeur en 1, avec la limitation_valeur en 2 et le limitation_valeur en 3 avec la limitation_valeur en 4 Si c'est nul en 3, seul le 4 est affiché, mais ce traitement est fait après. Quoi qu'il arrive, une carte a toujours 4 règles de définis après c'est soit règle 1, règle 2, règle 17, nul, soit règle 2, règle 3, règle 4, règle 5, soit nul, nul, nul, règle 89, soit nul, nul, nul, nul. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com