|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre du Club
![]() Inscription : juillet 2005 Messages : 245 ![]() |
Bonjour,
Je fais une requête sur ma base de données qui me renvoie des moyennes journalières de différentes valeurs stockées dans ma base : Code :
Comme je veux une table résultat avec toutes les dates, j'ai crée dans ma base une table calendrier avec une variable qui contient les dates de tous les jours. Et mon idée est de faire une jointure externe entre cette table et le résultat de ma requête, mais je ne vois pas comment l'écrire... parce que dans toutes les syntaxes que j'ai vues, le LEFT INNER JOIN travaille sur 2 tables 'en dur', et pas sur le résultat d'une requête. J'ai essayé quelque chose comme ça : Code :
Code :
Merci, Nico |
||||||
|
|
00
|
|
|
#2 |
![]() ![]() |
Quel est votre SGBD ?
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : juillet 2005 Messages : 245 ![]() |
PostgreSQL 8.4.8
Nico |
|
|
00
|
|
|
#4 | ||
![]() ![]() |
Essayez ainsi :
Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : juillet 2005 Messages : 245 ![]() |
ça marche super, merci !
Nico |
|
|
00
|
|
|
#6 | ||||||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Pour répondre à l'intervention de Waldar dans le topic du classement de ligue 1 :
En quoi cette syntaxe est nécessaire ? Pourquoi ne pas utiliser celle-ci ? Code :
Hmmmm ok, je vois un cas particulier où effectivement, ce n'est pas équivalent. Si str contient un NULL dans la référence à mss, alors ta syntaxe vire la ligne aussi de str lors de la jointure avec ca. Ceci dit, pour plus de clareté, je mettrait des parenthèse et j'indenterais (en effet, cette syntaxe s'apparente au fonctionnenent d'une sous requête (syntaxe ci-dessous) : Code :
Code :
|
||||||
|
|
00
|
|
|
#7 | ||
![]() ![]() |
Pour une fois je suis d'accord avec toi StringBuilder !
Je trouve l'imbrication des jointures (à la manière d'Access par exemple) de la requête de Waldar beaucoup moins claire que lorsqu'on fait se succéder les jointures complètes. Une remarques quand même sur la requête : Plutôt que >= et <, il vaut mieux utiliser BETWEEN, en faisant attention aux bornes qui sont incluses avec BETWEEN. 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
|
|
|
#8 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
J'ai édité mon post, il y a un cas où effectivement, la syntaxe de Waldar est nécessaire.
Mais dans ce cas, je trouve plus lisible de mettre entre parenthèses la seconde jointure et d'indenter : ça rappelle la syntaxe d'une jointure sur une sous-requête (et c'est d'ailleurs ni plus ni moins ce qu'on fait, de façon "propre" mais illisible). |
|
|
00
|
|
|
#9 | ||||||||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Voici un script qui illustre les différentes syntaxes :
Code :
Code :
Code :
Code :
|
||||||||
|
|
00
|
|
|
#10 |
![]() ![]() |
C'est plus propre avec la sous-requête.
__________________
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
|
|
|
#11 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Les plans d'exécution (sous SQL Server) sont cependant différents. Il faudra voir (j'imagine que le choix du SGBD a un impact) laquelle est la plus rapide. J'imagine que la syntaxe sans sous-requête est meilleure.
|
|
|
00
|
|
|
#12 |
![]() ![]() |
Mouais... des clés étrangères "NULLables" c'est pas terrible !
__________________
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
|
|
|
#13 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Bah c'est pour ça que les jointures externes existent
On peut aussi reprendre dans l'autre sens (et ça n'a pas plus de sens) : les éléments de listes de valeurs qui n'ont pas de référence. Moins ça arrive, mieux on se porte, mais bon, des fois c'est quand même utile |
|
|
00
|
|
|
#14 | ||
![]() ![]() |
Ça n'a rien à voir !
MCD : personne -0,n----diriger----1,1- projet Tables : personne (prs_id...) projet (prj_id, prj_id_chef...) <= clé étrangère non nulle. Quelles sont les personnes qui n'ont jamais dirigé de projet ? 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
|
|
|
#15 | ||||||||
![]() ![]() |
Citation:
Ce n'est pas plus complexe à comprendre qu'une jointure externe. Effectivement, deux parenthèses en plus aident à la lisibilité, mais elles ne changent rien en terme d'exécution de la requête. Chacun fait comme il souhaite, du moment que les résultats retournés sont corrects ! Cette syntaxe permet d'être plus concis dans l'écriture de la requête. Citation:
Comme un IN est transformé en une succession de OR. En fait, ça permet juste d'être plus concis dans l'écriture de la requête. ... tient, ça me rappelle quelque chose ! En l'occurrence BETWEEN a parfaitement sa place ici, j'ai du penser à la présence ou nom des heures minutes secondes, mais comme il s'agit d'une table calendrier la logique voudrait une ligne par jour. Donc bonne correction ! Là pour le coup, je ne suis pas d'accord. Vous le comprenez certes mieux, mais je ne vois pas en quoi : Code :
Code :
C'est exactement la même chose que de remonter certains critères de jointures dans le FROM pour les jointures externes. Ce n'est jamais obligatoire, c'est juste une simplification syntaxique qui répond à des règles précises ! Et si c'est un peu ambigu au début il suffit de rajouter des parenthèses comme l'a fait StringBuilder : Code :
Dans le même registre je continue à mettre des parenthèses avec les prédicats OR et AND lorsqu'ils sont mélangés car je ne me souviens jamais de leur règle de priorité ! Ça arrive tout le temps ! Heureusement qu'elles sont nullables les clefs étrangères. Pour reprendre votre exemple : on crée un nouveau projet, on lui affecte un responsable la semaine suivante. Il n'y a pas de problème, et encore une fois, ça arrive tout le temps. J'ai beaucoup cité Cinephil, rien de personnel bien entendu !
__________________
Email : http://scr.im/waldar |
||||||||
|
00
|
Copyright © 2000-2012 - www.developpez.com