我想知道是否可以将子查询结果转换为以逗号分隔的varchar数据类型列表。
例如:如果我有一个产品表。并且我有一个带有产品外键的产品图像表。现在,我想要列出所有产品,并使用选择查询应该有一个包含每个产品的productImage表的主键列表的列。
我正在使用sql server 2005。我们能以任何方式实现上述目标吗?
我想知道是否可以将子查询结果转换为以逗号分隔的varchar数据类型列表。
例如:如果我有一个产品表。并且我有一个带有产品外键的产品图像表。现在,我想要列出所有产品,并使用选择查询应该有一个包含每个产品的productImage表的主键列表的列。
我正在使用sql server 2005。我们能以任何方式实现上述目标吗?
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
我不确定我是否理解你的意思,但或许你可以尝试添加一个额外的表:
产品表 图片表 产品图片表
在最后一张表中,你至少需要三列,一个用于产品图片表的主键,分别为产品外键和图片外键。然后只需用简单的 SQL JOIN 语句就能轻松地将这些表连接起来。
SELECT Image_FK FROM Product_Images WHERE Product_Images.Product_FK = ##;
您将拥有与产品相关联的图像PK列表
希望这能帮到您,敬礼。
不容易,没有简单的方法。我发现最好的方法是单独执行子查询,并通过编程方式组装逗号分隔列表。
如果你真的需要在数据库中完成这个任务,你可以定义一个标量值函数,给定外键的值,该函数返回逗号分隔的列表。但是你必须在该函数内部使用游标来实现这个魔术。