|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 108 ![]() |
Je reprends actuellement une application en main. Un existant relativement conséquent. J'ai pas mal d'exemple de requête relativement complexe j'en prend une au hasard car je n'arrive pas à comprendre son fonctionnement.
Vous pourrez constater que les deux lefts joins avec sous requête ont une clause on sur un champ n'existant pas. c'est surement logique mais là je l'ai pas. Voici les ddl : Code :
Code :
|
||||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
OBA_DROITSDISP existe dans votre table objets_actions
A moins que cela ne soit pas la colonne dont vous parliez
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 108 ![]() |
oui tout à fait d'accord avec vous, cependant elle n'existe pas dans la subquery du left join, donc je comprends pas comment çà marche.
C'est comme si on joignait des tables avec 1=1 ? |
|
|
00
|
|
|
#4 |
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 446 ![]() |
Ça ressemble à une jointure conditionnelle.
Si OBA_DROITSDISP vaut 3, on effectue un produit cartésien avec les tables dérivées T et T3 et on prend en compte les valeurs qu'elles retournent, sinon ces données ne sont pas prises en compte dans le résultat, mais on retourne bien les lignes résultant du reste de la requête, avec les colonnes provenant de T et T3 à NULL. Un peu tordu, mais efficace.
__________________
Modérateur Langage SQL N'oubliez pas le bouton et pensez aux balises [code]Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur ![]() |
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 108 ![]() |
Désolé mais là je suis complètement largué.
comment la jointure pourrait se faire sachant qu'aucun champ de la sous-requête portant pourtant sur deux tables ne peut se rapprocher de la condition 'on' ? |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
je rejoins l'analyse de al1_24
Le ON entraine un produit cartésien mais renvoie des valeurs non nulles que si la condition est atteinte
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
00
|
|
|
#7 |
|
Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 108 ![]() |
ok maintenant je comprends mieux, désolé c'est la fin de journée.
Pour le coup effectivement c'est tordu. Y aurait-il selon vous un moyen de faire plus propre ? |
|
|
00
|
|
|
#8 |
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 446 ![]() |
Plus lisible certainement, en qualifiant toutes les colonnes avec l'alias de la table correspondante, et en ajoutant un commentaire sur ces "jointures" pour le prochain qui reprend la requête ne se casse pas la tête à comprendre.
Plus efficace, je ne pense pas.
__________________
Modérateur Langage SQL N'oubliez pas le bouton et pensez aux balises [code]Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur ![]() |
|
|
00
|
|
|
#9 | |||||||
![]() ![]() |
Citation:
Code :
1) Une jointure avec sa condition sur deux tables ! Code :
Code :
SELECT COUNT(DISTINCT p2.PRO_ID) AS LENGTH Code :
4) Les jointures conditionnelles vont retourner, chaque fois que OBJETS_ACTIONS.OBA_DROITSDISP = 3, la liste des identifiants de profil et le nombre de ces profils répondant aux conditions des sous-requêtes. Je ne suis pas loin de penser que cette partie est là pour de la présentation de données et alourdit inutilement la requête. Si tu peux nous dire ce qu'est censée retourner cette requête, on pourra t'aider à l'améliorer.
__________________
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
|
|
|
#10 |
|
Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 108 ![]() |
Merci pour ces nouveaux éléments.
Pour ma part je continu à avancer sur le problème car j'avoue que cette histoire de jointure conditionnelle me rend un peu dingue. Pour la jointure avec la condition sur deux tables, c'est en fait parce que la table droits à pour clé primaire la combinaison des deux tables en condition de jointure. Pour le length, j'ai l'impression que c'est pour masquer le cas où la jointure conditionnelle n'est pas rempli et donc éviter de ramener un hypothétique champ à blanc. Pour le group by en lieu et place du distinct je suis complétement d'accord. Sinon après regroupement d'informations en tout genre, ainsi qu'une analyse des informations des tables voici ce que je déduis de l'utilité de la requête. 1)Les écrans de l'application sont composés d'objets. 2)Chacun des objets à des actions (Lecture, Création, Modification, Suppression) stockés dans objets_actions. 3)Chacun des utilisateurs de l'application à un profil 4)Les droits font le rapprochement entre le profil et l'objets_actions Donc la requête exécuté au démarrage de l'application doit servir à remonter la liste de tous les objets et actions liées ainsi que la liste de tous les droits par profils. Qu'en pensez vous ? Sinon j'ai découpé le traitement en trois requêtes une première récupéré tous les profils, une seconde tous les objets et objets_actions. Je parcours les deux listes pour récupérer les droits par objets_actions et profils. Merci d'avance de votre aide. |
|
|
00
|
|
|
#11 | ||
![]() ![]() |
Citation:
Mais quand je lis : Citation:
__________________
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
|
|
|
#12 | |||
|
Membre du Club
![]() Développeur Java Inscription : octobre 2009 Messages : 108 ![]() |
Citation:
Citation:
Citation:
|
|||
|
|
00
|
|
|
#13 |
![]() ![]() |
De l'approche qui a été faite, mais je trouvais que ta modification n'allait pas assez loin car, si j'ai bien compris, tu continues de tout charger mais en plusieurs requêtes simples au lieu d'une compliquée. Une requête, à mon avis pas très compliquée, permettrait de ne ramener que les droits de l'utilisateur au lieu de l'ensemble et se serait sûrement beaucoup pus simple à gérer par l'application.
__________________
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
![]() Développeur Java Inscription : octobre 2009 Messages : 108 ![]() |
Ma modification était plus là pour m'aider à la compréhension de la requête.
En fait, je pense que l'écriture de la requête est là pour retourner forcément un résultat même si aucun droits n'est défini pour l'objet et son action (COALESCE). En fait c'est plus un principe de droit par défaut. J'avoue avoir encore du mal à comprendre le fondement. mais au moins j'ai la "logique" de la requête. Maintenant je rejoint le principe de dire qu'il serait préférable de stocker les informations liés à un utilisateur et non pas à tous les utilisateurs possibles. Côté applicatif, il est vrai que le traitement de ces informations entraînent une charge conséquente côté serveur multiple hashmap imbriqué. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com