sql - 将 STUFF 与 INNER JOIN 查询一起使用
问题描述
我的数据库中有三个表。Product 表、Types 表和名为 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
解决方案
组连接查询在 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;
演示
推荐阅读
- java - 在主集群的完全故障转移期间管理与 couchbase 辅助集群的应用程序连接
- ios - iOS(2021)中的 Firebase crashlytics 脚本无法通过 Testflight 运行
- ajax - 在 Laravel 中切换活动/非活动状态
- java - 如何在 Java 中包含和比较字符串和数组
- c# - 用于编辑 WordprocessingDocument 的 wpf 控件
- java - 如何以正确的方式实现构建器设计模式?
- web - MediaStream---为什么我的音轨的静音属性是真的?
- html - 在一张表中插入多个数据
- moodle - 在moodle / totara中创建一个本地插件,在用户创建的每门课程中注册用户,并在课程创建中注册所有用户
- reactjs - 带有子集合的查询必须使用“storeAs”我应该如何解决这个问题?