将SQL子查询转换为列表或字符型

3

我想知道是否可以将子查询结果转换为以逗号分隔的varchar数据类型列表。

例如:如果我有一个产品表。并且我有一个带有产品外键的产品图像表。现在,我想要列出所有产品,并使用选择查询应该有一个包含每个产品的productImage表的主键列表的列。

我正在使用sql server 2005。我们能以任何方式实现上述目标吗?


4
重复的 https://dev59.com/xnVD5IYBdhLWcg3wBm5h ? 无论如何,那个线程有你要寻找的答案。 - João Pereira
可能是重复的问题:如何使用SQL查询创建逗号分隔列表? - Martin Smith
3个回答

11
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)

以下是我在此查询中使用的测试数据。

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 

以下是查询结果:

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

如果您想在产品列表中使用ProductID 5,并且Image列表为空,请从查询中删除下一行:

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

结果将会多出一行(该行没有分配图片):

        5 null

太好了。非常感谢你! - janoulle

0

我不确定我是否理解你的意思,但或许你可以尝试添加一个额外的表:

产品表 图片表 产品图片表

在最后一张表中,你至少需要三列,一个用于产品图片表的主键,分别为产品外键和图片外键。然后只需用简单的 SQL JOIN 语句就能轻松地将这些表连接起来。

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

您将拥有与产品相关联的图像PK列表

希望这能帮到您,敬礼。


-2

不容易,没有简单的方法。我发现最好的方法是单独执行子查询,并通过编程方式组装逗号分隔列表。

如果你真的需要在数据库中完成这个任务,你可以定义一个标量值函数,给定外键的值,该函数返回逗号分隔的列表。但是你必须在该函数内部使用游标来实现这个魔术。


不需要光标,也不需要用户定义函数(UDFs)。 - Niikola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接