Alternative a la boucle

Alternative a la boucle - SQL/NoSQL - Programmation

Marsh Posté le 26-07-2019 à 22:38:08    

Bonjour a tous,
 
Je suis assez débutant en SQL, et je dois faire une requête vers une base assez... Hardcore. L'informaticien qui la gère est débordé, il a pas le temps de la faire donc j'aimerais lui proposer une solution clé en main.
 
La problématique: on a un produit avec un ou plusieurs commentaires. Je veux récupérer tous ces commentaires
 
Dans la structure, j'ai une table "Produit" et une table "Commentaire". Un produit peut avoir plusieurs commentaires, un commentaire est sur un seul produit. Sauf que les commentaires sont reliés de la manière suivante:
Table Produit
product_num | Comment_ID | etc...
Table Commentaire
Comment_ID | NextComment_ID | etc...
 
Donc si je veux trouver tous les commentaires d'un produit, je dois faire la jointure entre la table Produit et commentaire, et pour les suivants je dois regarder si N° CommentaireSuivant est pas nul...
 
Je sais pas si j'ai été clair, voici la requête crée pour l'instant:
 

Code :
  1. Declare @NoProduit Varchar(10)
  2.        Set @NoProduit = '0123456789'
  3. Declare @CommentID INT;
  4.        Set @CommentID = Null
  5. Declare @Results table(
  6.        NoProduit_Result Varchar(10),
  7.        Comments_Result Varchar(150),
  8.        Date_Result DateTime
  9. )
  10. Set @CommentID = (Select top 1 PR.Comment_ID from Produit PR with (nolock) where product_num = @NoProduit)
  11. While ((select Top 1 CO.NextComment_Id from Comments CO with (nolock) where CO.Comment_Id = @CommentID) IS NOT NULL)
  12. Begin
  13.        INSERT Into @Results
  14.              Select Top 1 @NoProduit, CO.Comment_Text, CO.Modified_On From Comments CO with (nolock) where CO.Comment_ID = @CommentID
  15.        Set @CommentID = (Select top 1 CO.NextComment_Id from Comments CO with (nolock) where CO.Comment_Id = @CommentID)
  16. END
  17. INSERT Into @Results (NoProduit_Result, Comments_Result, Date_Result )
  18.        Select Top 1 @NoProduit, CO.Comment_Text, CO.Modified_On From Comments CO with (nolock) where CO.Comment_ID = @CommentID
  19. Select * From @Results


 
Le problème, c'est que je sais que cette requête sera refusée car la boucle est quelque chose de trop dangereux si j'ai bien compris... Je suis preneur de toute alternative qui permettrait de se passer de la boucle et permette de récupèrer tous les résultats, merci d'avance :)
 
PS: j'ai testé la solution des jointure de la table comment sur elle même, mais ça permet de récupérer autant de résultat qu'on répète la ligne dans le code, ça me parais pas très propre:

Code :
  1. Left Join Comments as CO on  CO.Comment_Id = E.Comment_Id
  2. Left Join Comments as CO2 on CO.NextComment_ID = CO2.Comment_ID
  3. Left Join Comments as CO3 on CO2.NextComment_ID = CO3.Comment_ID


Message édité par vylkor le 26-07-2019 à 22:45:35
Reply

Marsh Posté le 26-07-2019 à 22:38:08   

Reply

Marsh Posté le 27-07-2019 à 09:49:45    

Ce que tu vas pouvoir utiliser dépend fortement du SGBDR, donc tu dois préciser lequel tu emploie s.
Par exemple ous SQL Server ça peut se faire avec une CTE (premier lien en français : https://www.softfluent.fr/blog/expe [...] SQL-Server ).


Message édité par TotalRecall le 27-07-2019 à 09:51:48

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 27-07-2019 à 18:45:40    

La structure de la table commentaires me paraît vraiment naze et pas pratique du tout à requêter :/
En toute logique, c'est le ProduitID qui devrait être clé étrangère dans la table commentaire et pas le contraire puisqu'on est dans une relation 1-n : 1 produit à 0 à plusieurs commentaires. Ca sent la BD mal conçue :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-07-2019 à 10:36:41    

c'est du sql server, je crois

 

Essaye avec ce genre d'approche : https://stackoverflow.com/questions [...] -any-child , ce sera toujours plus perf que de boucler depuis l'exterieur du SGBD

 

ce serait plus simple avec une autre structure, genre ajouter une colonne product_id_root, mets à jour les données existantes, et ajoute une trigger qui, lors de l'ajout d'une ligne met à jour cette donnée


Message édité par flo850 le 29-07-2019 à 10:37:52

---------------

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed