2010-08-10 19 views
1

Je veux savoir si nous pouvons convertir un résultat de sous-requête en liste séparée par des virgules dans le type de données varchar.Convertir la sous-requête sql en liste ou en varchar

Par exemple. Si j'ai une table de produit. Et j'ai la table d'image de produit avec la clé étrangère du produit. maintenant je veux lister tous les produits avec une requête de sélection qui devrait avoir une colonne avec la liste de la liste pk de la table productImage pour chaque produit.

J'utilise sql server 2005. Pouvons-nous réaliser ce qui précède de quelque façon que ce soit?

+3

en double de http://stackoverflow.com/questions/111341/combine-multiple-results-in-a- sous-requête en une seule valeur séparée par une virgule? Quoi qu'il en soit, ce fil a la réponse que vous cherchez –

+0

duplication possible de [Comment créer une liste séparée par des virgules en utilisant une requête SQL?] (Http://stackoverflow.com/questions/1817985/how-do-i -create-a-separated-list-using-a-sql-query) –

Répondre

9
Select p.ProductID, 
     Stuff((Select ','+Cast(ImageID as varchar(10)) 
       From @ProductImages i 
       Where p.ProductID=i.ProductId 
       For XML PATH('') 
      ),1,1,'' 
      ) as ImageList 
    From @Products p 
Where p.ProductID in (Select ProductID From @ProductImages) 

Voici les données de test j'ai utilisé pour cette requête

Declare @Products Table (ProductID int primary key, ProductName varchar(20))   
Declare @ProductImages Table (ProductId int, ImageId int, Primary Key (ProductId, ImageId)) 

Insert Into @Products 
Select 1, 'Product1' Union all 
Select 2, 'Product1' Union all 
Select 3, 'Product1' Union all 
Select 4, 'Product1' Union all 
Select 5, 'Product1' 

Insert Into @ProductImages 
Select 1,1 Union all 
Select 1,2 Union all 
Select 1,3 Union all 
Select 2,4 Union all 
Select 2,5 Union all 
Select 3,1 Union all 
Select 4,3 Union all 
Select 4,5 

Et voici la suite de la requête:

ProductID ImageList 
--------- --------- 
     1 1,2,3 
     2 4,5 
     3 1 
     4 3,5 

Si vous voulez avoir ProductID 5 dans la liste avec null pour Liste d'images, il suffit de retirer la ligne suivante de la requête:

Where p.ProductID in (Select ProductID From @ProductImages) 

Vous aurez une ligne supplémentaire dans le résultat (il ne dispose pas d'images attribuées):

 5 null 
+0

Parfait. Merci beaucoup pour cela! – janoulle

-1

Pas facilement, non. J'ai trouvé que la meilleure façon de faire ces choses est d'exécuter la sous-requête par elle-même, et d'assembler la liste séparée par des virgules par programmation.

Si vous avez vraiment besoin de le faire sur la base de données, vous pouvez définir une fonction scalaire que vous pouvez attribuer à la valeur de la clé étrangère et qui renvoie la liste séparée par des virgules. Vous devrez utiliser un curseur à l'intérieur de cette fonction pour que la magie se produise.

+0

Pas besoin non plus de curseurs pour les UDF – Niikola

0

Je ne sais pas si je vous suis, mais vous pouvez peut-être essayer d'ajouter une table supplémentaire:

Tableau produit Tableau images Tableau Product_Images.

Dans ce dernier tableau, vous aurez au moins 3 colonnes, PK pour la table Product_Images, Product_FK et Images_FK. Ensuite, avec juste

SELECT Image_FK FROM Product_Images WHERE Product_Images.Product_FK = ##; 

vous aurez une liste de PK images associées à un produit

Espérons que cela vous aidera, salutations.

Questions connexes