|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||||||||||||||
|
Futur Membre du Club
![]() Inscription : mars 2004 Messages : 50 ![]() |
Bonjour,
J'ai un petit soucis de requête SQL. Je suis gêné par le comportement par défaut du JOIN (avec Excel) : association automatique des champs de même nom. Prenons une première table comprenant (ID_CLIENT, NOM), et une seconde table comprenant (ID_CLIENT, TYPE_NUMERO,NUMERO). Code [Table CLIENT] :
et Code [Table TELEPHONE] :
Et je voudrais faire une requête me sortant : Code [Table NUMERO] :
Sans les JOIN, c'est simple : Code :
Code :
Code :
Code [Table NUMERO] :
Est-ce que vous auriez une 'belle' solution à mon problème ? Moi qui vient tout juste d'apprendre la manipulation du JOIN, et uniquement pour l'expliquer à quelqu'un d'autre, j'aurais tendance à me contenter d'un : Citation:
|
|||||||||||||||
|
|
00
|
|
|
#2 | |||
|
Membre éprouvé
![]() Inscription : janvier 2009 Messages : 301 ![]() |
Bonjour,
Citation:
Ton SQL doit bien supporter l'instruction CASE alors, il convient de faire Code :
Maintenant, il faut se poser la question si c'est le travail de la base de données de présenter les résultats en colonne. Pour ma part, je pense que c'est à l'applicatif d'effectuer la mise en forme. Notre ami CinePhil te dirait, la cosmétique ce n'est pas le travail de ta base de données @+ |
|||
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Responsable de service informatique Inscription : janvier 2009 Messages : 1 092 ![]() |
Bonjour,
J'ajouterai que tu compares une requêtes sans JOIN, mais avec des critères de sélection sur le type de numéro, et une requête avec JOIN, mais sans les critères en question. Donc pas étonnant que le résultat soit légèrement différent... Tatayo. |
|
|
00
|
|
|
#4 |
![]() ![]() |
seabs, n'oubliez pas l'agrégat sur les numéros, actuellement votre requête renvoie deux lignes.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#5 | |||||||
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
Code :
|
|||||||
|
|
00
|
|
|
#6 | ||||
|
Futur Membre du Club
![]() Inscription : mars 2004 Messages : 50 ![]() |
Merci à seabs et Waldar pour vos réponses instructives.
Citation:
J'vais fouiller des conseils sur des forums SQL / VB, car ça me parait bizzare qu'il ne reconnaisse qu'une partie du CASE/WHEN THEN. Une autre idée sinon ? ![]() Citation:
![]() Citation:
J'utilise d'ailleurs des SELECT INTO pour m'affranchir de l'ouverture/fermeture des fichiers Excel. Citation:
Pour Rei Ichido et tatayo : Désolé, j'ai débauché plus d'une 1/2 heure en retard vendredi pour faire ce message, donc il y avait peut-être quelques imperfections dues à mon impatience à décoller. De plus, c'est une copie visuelle de code d'un PC à un autre (pas Internet sur mon PC où je code), d'où les oublis probables. Néanmoins, je pensais que mes explications étaint suffisamment claires pour avoir droit à une réponse à mon problème. |
||||
|
|
00
|
|
|
#7 | ||
|
Futur Membre du Club
![]() Inscription : mars 2004 Messages : 50 ![]() |
Citation:
Code :
CASE WHEN T.TYPE_NUMERO = 'FIXE' THEN T.NUMERO END AS NumeroFixe Code :
IIF(T.TYPE_NUMERO = 'FIXE',T.NUMERO,NULL) AS NumeroFixe Il ne reste que l'erreur donnée par Waldar : Citation:
|
||
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Grouper par id_client, et dans les fonctions mettre un MAX ou un MIN (selon la façon dont le SGBD trie les null) :
Code :
Edit : cela dit, je préfère largement la version à double jointure ! |
||
|
|
00
|
|
|
#9 |
![]() ![]() |
Essayez le même besoin avec quinze attributs, comparez les syntaxes des requêtes ainsi que les performances et dites-moi ensuite lequel vous préférez !
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#10 | ||||
|
Futur Membre du Club
![]() Inscription : mars 2004 Messages : 50 ![]() |
Citation:
Citation:
En revanche, si la vitesse de la requête sera certainement plus rapide avec la solution MAX(IFF()) (seulement 2 tables à joindre, le reste est réalisé avec des UNION au travers du IIF), c'est aussi un peu moins lisible pour quelqu'un reprenant le code, à mon goût. Petite remarque : J'ai dû remplacer l'agrégation sur C.ID_CLIENT par C.NOM. Code :
![]() En tout cas, merci à tous, cela fonctionne exactement comme je le souhaite à présent !! Et ça m'a permis d'intégrer en prime le fonctionnement du IIF, donc c'est tout bénef !!
|
||||
|
|
00
|
|
|
#11 | |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
Donc, oui, si la table à double jointure est vraiment énorme, ou s'il faut la caser 100 fois, je vais adopter une méthode efficace. Et pour Cyborg : j'avais fait ça vite fait sans checker, my bad, c'est pourtant évident !
|
|
|
|
01
|
|
|
#12 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 641 ![]() |
Citation:
Il n'y a pas de discussion à avoir. Vous aidez des personnes qui ont généralement une connaissance très réduite en SQL et vous leur inculquez des mauvaises pratiques. Que ce passera-t-il quand ils devront reprendre toute leur application car leur requête ne seront plus performante ? C'est une perte de temps et d'argent. Combien de fois je me suis retrouvé devant des programmes batch totalement inutilisables car la personne qui l'avait développé avait justement utilisé ce qu'il pensait être lisible et non performant ? Bref je trouve votre vision vraiment limitée, il faut savoir se remettre en question pour évoluer. |
|
|
|
10
|
|
|
#13 | ||
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
Citation:
Dans le cadre des projets avec fort turn-over et utilisation massive de débutants, est-ce qu'il vaut mieux passer 30% de développement en plus, et 30% sur toutes les opérations de maintenance et d'évolution pour le cas où un jour la volumétrie explose ? Cela dit, j'accorde le point sur les bonnes pratiques à faire passer ici. |
||
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut,
C'est pas non plus une usine à gaz... tu m'étonnes que tu aies un gros turnover dans ton équipe si tu considères que GROUP BY + max ne vaille pas la peine d'être expliqué parce que consommateur d'un peu de budget (genre 5 minutes pour lui expliquer le GROUP BY) ! Et puis surtout, ce type de question sur le "PIVOT" doit être dans le TOP 5 des questions les plus posées sur ce forum et ailleurs... Bref, c'est un autre débat. Et sinon Seabs : non, ce n'est pas du cosmétique, et si des gens te le disent, il faut pas le croire. Je pense vraiment pas que tu préfères pour toutes les propriétés modélisées en clef - valeur (donc "en lignes") coder des boucles dans tous les sens au lieu de binder directement sur ta requête.
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
00
|
|
|
#15 | |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
Alors tu vas me dire, confrontés à un code qu'ils ne comprennent pas forcément bien, les débutants peuvent toujours venir ici, et ça va les former, etc. Personnellement je constate juste que ça génère plus de bugs qu'autre chose, vu que je dois repasser après voire être appelé en pompier. => Au final rien ne remplacera l'encadrement, et dans ce contexte là je vais faire l'effort de faire passer ce que je pense être de bonnes pratiques (je n'ai certainement pas la prétention d'être un expert SQL). |
|
|
|
00
|
|
|
#16 | |||||
|
Invité régulier
![]() Inscription : juillet 2011 Messages : 11 ![]() |
Citation:
Code :
Temps d'exécution de SQL Server : Temps UC = 500 ms, temps coulé = 588 ms. Avertissement : la valeur nulle est éliminée par un agrégat ou par une autre opération définie. Code :
Temps d'exécution de SQL Server : Temps UC = 875 ms, temps coulé = 895 ms. Je pense qu'y a pas photo. Par contre, en ajoutant des ORDER BY id_article aux 2 requêtes, j'obtiens Temps d'exécution de SQL Server : Temps UC = 468 ms, temps coulé = 574 ms. Avertissement : la valeur nulle est éliminée par un agrégat ou par une autre opération définie. Temps d'exécution de SQL Server : Temps UC = 532 ms, temps coulé = 619 ms. Des explications? |
|||||
|
|
00
|
|
|
#17 | ||||
|
Invité régulier
![]() Inscription : juillet 2011 Messages : 11 ![]() |
Bon finalement il semblerait qu'il y'a photo et qu'il faut vraiment voir au cas par cas.
Sur un cas réel pour mon site: Code :
Code :
Par contre, la première reste plus rapide sur le serveur de prod
|
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com