|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||||||
|
Invité régulier
![]() Inscription : février 2010 Messages : 9 ![]() |
Bonjour à tous,
j'ai comme vous pouvez vous en douter un problème au niveau d'une requête SQL trop complexe pour mon tout petit niveau, et j'aurais grandement besoin de votre aide ! Voici le contexte : dans le cadre d'un dispositif de détection d'articles dans un rayonnage (en RFID), je dois créer un petit logiciel permettant de gérer les infos reçues... Nous avons concrètement des articles (textile ici) répartis dans plusieurs rayons d'un magasin. Chaque article est attaché à une puce RFID, identifiée par un id unique. Les différentes antennes RFID du dispositif vont scanner leur rayon respectif et récupérer les identifiants des puces RFID qu'ils auront captés. Le dispositif communique ensuite cette liste de couples id_Rfid/id_Antenne à la base de données. C'est ensuite à partir de cette base de données que le logiciel va afficher toutes les infos nécessaires et effectuer les traitements que l'utilisateur aurait besoin de faire. Pour le moment j'ai la base de donnée que voici : ![]() PS : j'utilise Visual Studio pour le logiciel et la base de donnée. Nous avons donc les tables suivantes : - article_detecte : contient l'ensemble des id_Rfid (uniques) des articles détectés par le dispositif, ainsi que identifiant de l'antenne qui les a détectés. En effet, il existe plusieurs zones et donc plusieurs antennes RFID. - tag : contient les associations entre les id_Rfid des tags et les id_Articles. Me sert à faire le lien entre un tag et l'article sur lequel il est attaché. - article : c'est ma "base articles". Elle contient en fait toutes les désignations articles avec lesquels je travaille. id_Article identifie un article de façon unique et les autres champs nous donnent diverses informations dont nous pouvons avoir besoin (dont l'emplacement théorique du produit, qui est très important). - zone : définit les différentes zones de détection dans le magasin (ex : rayon 1, rayon 2, réserve, cabines d'essayage...) - antene (avec une faute d'orthographe, oui désolé est installée. Voilà, je pense que c'est à peu près complet...mais c'est maintenant que mon problème arrive ! Je souhaites créer une requête qui me donnerais l'ensemble des articles détectés avec leur emplacement réel et théorique ainsi que leur quantité (et avec diverses informations comme le cug, le libelle, les seuils, etc...mais ça je saurais faire une fois le "gros" de la requête trouvé...). Mais j'ai un gros souci : il me faut bien sur les quantités des articles là où on les a détectés réellement mais aussi les articles non détectés avec une quantité de 0 (zéro). En effet, si un article (un tag) est référence mais non détecté, c'est qu'il est en rupture de stock. Il faut alors l'afficher à zéro ! Il y a donc une histoire de LEFT OUTER JOIN mixé avec des INNER JOIN, mais je n'y arrive pas du tout Voici le contenu des tables : Code :
Code :
Code :
Code :
Code :
J'ai donc besoin de pouvoir afficher l'ensemble des articles détectés, avec le cug, le libelle, l'emplacement, la quantité, les seuils, etc... et aussi les articles faisant parti de la table "article" qui ne sont pas détectés (donc pas présents dans "article_detecte") en leur attribuant la quantité zéro pour signifier la rupture. Après même si la quantité zéro n'est pas envisageable car infaisable avec un COUNT, il faudrait au moins avoir un signe distinctif pour ces articles en rupture (par exemple un champ à NULL pour ces articles en question) pour que je puise faire un traitement dans le logiciel par la suite pour afficher la valeur zéro. Voici à partir de ces tables ce que j'aimerais obtenir : Code :
Avez-vous une idée de la requête qui pourrait me donner ce résultat ? Je nage complètement actuellement, je suis paumé... Merci d'avance à ceux qui voudront bien me donner un coup de main ! Bonne soirée |
||||||||||||
|
|
20
|
|
|
#2 |
|
Invité régulier
![]() Inscription : février 2010 Messages : 9 ![]() |
Oula désolé je ne pensait pas que la "présentation" des tables allait être modifiée...du coup tout est compacté avec seulement un espace entre les champs
Désolé pour ça, avez-vous un moyen d'afficher ces tables facilement et clairement ? En espérant que ça ne gêne pas trop à la compréhension du problème. Merci |
|
|
00
|
|
|
#3 | |||
![]() ![]() |
Tu nous montres ce que tu as essayé comme requête ?
Si j'ai bien compris, tu veux tous les articles et les informations disponibles dans les autres tables quand elles existent. Donc tu auras un truc du genre : Code :
Citation:
Code :
COALESCE(une_colonne, 0) AS un_nom_alias
__________________
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
|
|
|
#4 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Je pense que tu n'as besoin que d'un LEFT JOIN, le reste pouvant se faire en INNER JOIN via une sous-requête (ce qui est mieux pour les perfs)
Un bon début de réflexion : Code :
|
||
|
|
00
|
|
|
#5 | ||
|
Invité régulier
![]() Inscription : février 2010 Messages : 9 ![]() |
Merci beaucoup pour vos réponses !
Mon problème est résolu, j'ai enfin réussi à obtenir les infos que je voulais même si je crois que ma requête n'est pas très académique et pas optimisée... Mais ça fonctionne Pour info voici l'horreur qui me retourne le bon résultat (à part les quantités qui sont à 1, mais que je change par la suite dans le code du programme en c#) : Code :
Je continue les tests en faisant des modifications dans la base de donnée pour vérifier que c'est toujours cohérent, et pour le moment ça semble bon. Merci encore ! |
||
|
|
00
|
|
|
#6 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Par contre as tu testé ma requête, as tu vraiment besoin de mettre toutes les tables en OUTER JOIN ? |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com