sql-server - 加入额外表时的东西?
问题描述
见下表TABLE
:
ID FIELD_1
-------------
1 123
1 456
1 789
2 111
我想列出FIELD_1
每个 ID 的所有 s,如下所示:
select [ID],
stuff((
select '; ' + [FIELD_1]
from [TABLE] t1
where t1.[ID] = t2.[ID]
for xml path ('')
),1,1, '') as [FIELDS]
from [TABLE] t2
输出:
ID FIELDS
------------
1 123; 456; 789
2 111
但现在; 每个都FIELD_1
可以在另一个表中有多个条目(TABLE2
):
FIELD_1 FIELD_2
------------------
123 A
123 B
456 B
111 C
111 X
111 Z
我需要将这些添加到我的输出中,如下所示:
ID FIELDS
------------
1 123 (A, B); 456 (B); 789
2 111 (C, X, Z)
所以我通过如下加入来尝试这个:
select [ID],
stuff((
select '; ' + [FIELD_1] + [FIELD_2]
from [TABLE] t1
where t1.[ID] = t2.[ID]
for xml path ('')
),1,1, '') as [FIELDS]
from [TABLE] t2
left join [TABLE2] t3 on t2.[ID] = t3.[ID]
但这会为FIELD_1
in的每次出现返回一行TABLE2
。
此查询的正确方法是什么?我需要STUFF()
在现有的STUFF()
选择中使用吗?
解决方案
declare @t2 table (id int)
insert into @t2 values (1),(2)
declare @t1 table (id int, field_1 varchar(55))
insert into @t1 values (1,'123'), (1,'456'),(1,'789'),(2,'111')
declare @t3 table (field_1 varchar(55), field_2 varchar(55))
insert into @t3 values ('123','A'), ('123','B'),('456','B'),('111','C'),('111','X'),('111','Y')
select [ID],
stuff(( select '; ' + [FIELD_1]+ISNULL(' ('+[FIELDS_2]+')','')
from(
select id, [FIELD_1],
stuff((
select ',' + t3.[FIELD_2]
from @t3 t3
where t3.[FIELD_1] = t1.[FIELD_1]
for xml path ('')
),1,1, '') as [FIELDS_2]
from @t1 t1
where t1.[ID] = t2.[ID])t for xml path ('')
),1,1, '') as [FIELDS]
from @t2 t2
推荐阅读
- java - 方法引发了“java.lang.IllegalArgumentException”异常。如何使用 java 反射设置私有最终值
- javascript - Multer 无法读取未定义的属性“文件名”
- php - 用 Twig 中的数组值替换字符串
- latex - 为什么我会收到“\
有一个额外的 }" 错误 - android - Android Kotlin Room Repository 无法从详细活动中检索行
- python - ValueError:分类指标无法处理未知目标和二进制目标的混合:0 和 1 预测
- javascript - 只记录到第一个数组
- c++ - windows shell扩展覆盖无法显示
- javascript - 从交互式 highchart.js 图中抓取数据
- python - 在 Python Pandas 中使用 DataFrame 中的日期列?