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 :
- Declare @NoProduit Varchar(10)
- Set @NoProduit = '0123456789'
- Declare @CommentID INT;
- Set @CommentID = Null
- Declare @Results table(
- NoProduit_Result Varchar(10),
- Comments_Result Varchar(150),
- Date_Result DateTime
- )
- Set @CommentID = (Select top 1 PR.Comment_ID from Produit PR with (nolock) where product_num = @NoProduit)
- While ((select Top 1 CO.NextComment_Id from Comments CO with (nolock) where CO.Comment_Id = @CommentID) IS NOT NULL)
- Begin
- INSERT Into @Results
- Select Top 1 @NoProduit, CO.Comment_Text, CO.Modified_On From Comments CO with (nolock) where CO.Comment_ID = @CommentID
- Set @CommentID = (Select top 1 CO.NextComment_Id from Comments CO with (nolock) where CO.Comment_Id = @CommentID)
- END
- INSERT Into @Results (NoProduit_Result, Comments_Result, Date_Result )
- Select Top 1 @NoProduit, CO.Comment_Text, CO.Modified_On From Comments CO with (nolock) where CO.Comment_ID = @CommentID
- 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 :
- Left Join Comments as CO on CO.Comment_Id = E.Comment_Id
- Left Join Comments as CO2 on CO.NextComment_ID = CO2.Comment_ID
- Left Join Comments as CO3 on CO2.NextComment_ID = CO3.Comment_ID
|
Message édité par vylkor le 26-07-2019 à 22:45:35