我的数据库中有三个表。产品表,类型表和映射表Prod_Type。我的数据库是sql server,这就是为什么我不能使用group_concat函数而使用Stuff函数的原因。我的表结构如下
产品表
Prod_ID | Name | Brand ------- ---- ----- 1 | Name1 | Brand1 2 | Name2 | Brand2 3 | Name3 | Brand3 4 | Name4 | Brand4 5 | Name5 | Brand5 6 | Name6 | Brand6 7 | Name7 | Brand7
类型表
Type_ID | TypeName ------- -------- 1 | TypeName1 2 | TypeName2 3 | TypeName3 4 | TypeName4 5 | TypeName5
Prod_TypeTable
Prod_IDM | Type_ID -------- ------- 1 | 1 1 | 3 1 | 4 1 | 5 2 | 2 2 | 3 3 | 4 4 | 5 4 | 1 5 | 4 5 | 3 5 | 2 6 | 2 6 | 3 7 | 5
我能够将产品表加入到Prod_type的映射表中。我使用了东西查询来避免出现多个结果。我的查询是这样的:
Select top 5 * from ProductTable inner Join (SELECT Prod_IDM, STUFF((SELECT ', ' + CAST(Type_ID AS VARCHAR(10)) [text()] FROM Prod_TypeTable WHERE Prod_IDM = t.Prod_IDM FOR XML PATH(''), TYPE) .value('.','NVARCHAR(MAX)'),1,2,' ') TypeID FROM Prod_TypeTable t GROUP BY Prod_IDM ) As TypeList on TypeList.Prod_IDM = ProductTable.Prod_ID
我现在需要做的是将我先前的查询结果连接到类型表中,以便能够分别获取类型的名称。我应该怎么做呢?我的预期输出将是这样的
Prod_ID | Name | TypeName ------- ---- --------- 1 | Name1 | TypeName1, TypeName3, TypeName4, TypeName5 2 | Name2 | TypeName2, TypeName3 3 | Name3 | TypeName4 4 | Name4 | TypeName5, TypeName1 5 | Name5 | TypeName4, TypeName3, TypeName2 6 | Name6 | TypeName2, TypeName3 7 | Name7 | TypeName5
至少对于没有STRING_AGG功能的早期版本,在SQL Server中很难用组串联查询来表达。诀窍在于,外部查询应该作用于表,这些表的键具有要合并到一个或多个其他表中而要聚合的值。在这种情况下,我们放在ProductTable外面,然后汇总其他所有内容,以生成每种产品的CSV类型列表。
STRING_AGG
ProductTable
SELECT p.Prod_ID, p.Name, TypeName = STUFF(( SELECT ',' + t.TypeName FROM Prod_TypeTable pt INNER JOIN TypeTable t ON pt.Type_ID = t.Type_ID WHERE pt.Prod_IDM = p.Prod_ID FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') FROM ProductTable p ORDER BY p.Prod_ID;