将 STUFF 与 INNER JOIN 查询结合使用

ble*_*eyk 4 sql sql-server select

我的数据库中有三个表。产品表、类型表和名为 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
Run Code Online (Sandbox Code Playgroud)

类型表

 Type_ID   |   TypeName
 -------       --------
    1      |   TypeName1
    2      |   TypeName2
    3      |   TypeName3
    4      |   TypeName4
    5      |   TypeName5
Run Code Online (Sandbox Code Playgroud)

产品类型表

  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
Run Code Online (Sandbox Code Playgroud)

我能够将产品表连接到 Prod_type 的映射表。我使用 stuff 查询来避免出现多个结果。我的查询是这样的:

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
Run Code Online (Sandbox Code Playgroud)

我现在需要做的是将之前的查询结果加入到 type table 中,以便能够分别获取类型的名称。我怎样才能做到这一点?我的预期输出会是这样的

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 
Run Code Online (Sandbox Code Playgroud)

Tim*_*sen 8

组串联查询在 SQL Server 中可能很难表达,至少对于没有函数的早期版本来说是这样STRING_AGG。诀窍在于,外部查询应该作用于其键具有您想要通过连接到一个或多个其他表来聚合的值的表。在本例中,我们将ProductTable其放在外部,然后聚合其他所有内容,为每个产品生成类型的 CSV 列表。

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;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

演示