student表:id(学号),truename(真是名字),classid(课程代号)studentclass表:classid(课程代号),classname(课程名)classchoose表:sid(学生代号),cid(课程代号)
我现在要选出所有学生的记录 包括他们所选课程的课程名。
我写的SQL这样:
select * from student a left join classchoose b on a.id=b.sid left join studentclass c b.cid=c.classid
但这样写 选出来的 是所有被选课程为主 一个学生选了几个课程 就都会列出来,能不能有办法,只以学生为主,比如一个学生选了多门课,也只列出那一个学生。
我现在要选出所有学生的记录 包括他们所选课程的课程名。
我写的SQL这样:
select * from student a left join classchoose b on a.id=b.sid left join studentclass c b.cid=c.classid
但这样写 选出来的 是所有被选课程为主 一个学生选了几个课程 就都会列出来,能不能有办法,只以学生为主,比如一个学生选了多门课,也只列出那一个学生。
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'-- 查询处理
SELECT *
FROM(
SELECT DISTINCT
id
FROM @t
)A
OUTER APPLY(
SELECT
[values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM @t N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N/*--结果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
--*/类似这种?
stuff((select ','+b.classname
from classchoose a join studentclass b on a.cid = b.classid
where a.sid = t.id for xml path('')),1,1,'') cname
from student t
group by id,truename