SQL如何查询两个表连接明细表结果用分隔符分开?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL如何查询两个表连接明细表结果用分隔符分开?相关的知识,希望对你有一定的参考价值。

对数据库不是太懂,请各位老师帮忙看一下,问题如下:有两个表 学生表(字段有学生编号,姓名,),科目表(字段有学生编号,科目编号,科目名称),现学生表有编号01,姓名学生A,报有有两个科目(学生编号01,科目编号1,科目名称语文 学生编号01,科目编号2,科目名称数学),想实现下图的查询结果:

'''

CREATE TABLE T_Students

(

ID varchar(50),

F_Name varchar(50)

)

CREATE TABLE T_Subjects

(

Student_ID varchar(50),

Subject_ID varchar(50),

F_SubjectName varchar(50)

)

insert T_Students values ('01','A')

insert T_Subjects values ('01','1','语文')

insert T_Subjects values ('01','2','数学')

insert T_Students values ('02','B')

insert T_Subjects values ('02','1','语文')

insert T_Subjects values ('02','2','数学')


select a.ID,a.F_Name,stuff((select ','+Subject_ID from T_Subjects 

where Student_ID=a.ID for xml path('')),1,1,'') as SubjectID,stuff((select ','+F_SubjectName from T_Subjects 

where Student_ID=a.ID for xml path('')),1,1,'') as SubjectName

from T_STudents as a group by ID,F_Name

'''

请点击输入图片描

参考技术A


需要用到stuff函数:

例:

       id             name
          1               张三
          1               李四
          2               王五
          2               赵六
结果:
         Id          name
          1          张三,李四
          2          王五,赵六

创建测试表及插入数据:

create table test
(id int,
name varchar(10))
insert into test values (1,' 张三')
insert into test values (1,' 李四')
insert into test values (2,' 王五')
insert into test values (2,' 赵六')

执行语句:

select id,stuff((select ','+name from test 
where a.id=id for xml path('')),1,1,'') as name
from test as a group by id

执行结果截图:





参考技术B


需要用到stuff函数:

例:

       id             name
          1               张三
          1               李四
          2               王五
          2               赵六
结果:
         Id          name
          1          张三,李四
          2          王五,赵六

创建测试表及插入数据:

create table test
(id int,
name varchar(10))
insert into test values (1,' 张三')
insert into test values (1,' 李四')
insert into test values (2,' 王五')
insert into test values (2,' 赵六')

执行语句:

select id,stuff((select ','+name from test 
where a.id=id for xml path('')),1,1,'') as name
from test as a group by id

执行结果截图:





追问

我看到有些用inner join或者 left join的,适用这种方法能实现我之前说的要求吗?stuff这个函数我试过了,那个单机软件不支持

本回答被提问者采纳
参考技术C 因为你没有提供具体的数据库类型,所以我写了三种语法:
Oracle语法:
select a.学生编号,
a.姓名,
listagg(b.科目编号, ',') within group( order by b.科目编号) 科目编号,
listagg(b.科目名称, '+') within group( order by b.科目编号) 科目名称
from 学生表 a,
科目表 b
where a.学生编号 = b.学生编号
group by a.学生编号,
a.姓名;

SqlSerVer语法:
select
t.学生编号,
t.姓名,
left ( t.科目编号, len( t.科目编号 ) - 1 ) 科目编号,
left ( t.科目名称, len( t.科目名称 ) - 1 ) 科目名称
from
(
select
a.*,
( select b.科目编号 + ',' from 科目表 b where a.学生编号 = b.学生编号 order by b.科目编号 for xml path ( '' ) ) 科目编号,
( select b.科目名称 + '+' from 科目表 b where a.学生编号 = b.学生编号 order by b.科目编号 for xml path ( '' ) ) 科目名称
from
学生表 a
) t;

mysql语法:
select
a.学生编号,
a.姓名,
group_concat( b.科目编号 order by b.科目编号 separator ',' ) 科目编号,
group_concat( b.科目名称 order by b.科目编号 separator '+' ) 科目名称
from
学生表 a,
科目表 b
where
a.学生编号 = b.学生编号
group by
a.学生编号,
a.姓名;

以上是关于SQL如何查询两个表连接明细表结果用分隔符分开?的主要内容,如果未能解决你的问题,请参考以下文章

数据库SQL Server2012笔记——多表查询子查询分页查询用查询结果创建新表和外连接

如何用SQL语句的查询实现两个表之间的查询连接

用sql语句进行多表连接查询,怎么不查出重复数据

用逗号分隔表的查询是交叉连接查询吗?

sql 用union合并合并查询结果

sql server 2005实现树形菜单显示的数据库表怎么设计?