假如有两个表Tstudent和Tcourse表结果分别如下
Tstudent表:id  sid   sname
             1   001   张三
             2   002   李四Tcourse表   id  sid   course
             1  001    语文
             2  002    语文
             3  001    数学
             4  001    英语现在我要查出每个学生所学的学科有哪些,并显示出来的结果形式如下:
   学号    姓名     所学课程
    001    张三     语文 数学 英语
    002    李四     语文请问这样SQL语句要怎么写呢,先谢谢了!

解决方案 »

  1.   

    ---测试数据---
    if object_id('[Tstudent]') is not null drop table [Tstudent]
    go
    create table [Tstudent]([id] int,[sid] varchar(3),[sname] varchar(4))
    insert [Tstudent]
    select 1,'001','张三' union all
    select 2,'002','李四'
    if object_id('[Tcourse]') is not null drop table [Tcourse]
    go
    create table [Tcourse]([id] int,[sid] varchar(3),[course] varchar(4))
    insert [Tcourse]
    select 1,'001','语文' union all
    select 2,'002','语文' union all
    select 3,'001','数学' union all
    select 4,'001','英语'
     
    ---查询---
    select b.sid as 学号,a.sname as 姓名,
    所学课程=(select ' '+course from Tcourse where sid=b.sid for xml path(''))
    from Tstudent a 
    join Tcourse b on a.sid=b.sid
    group by b.sid,a.sname---结果---
    学号   姓名   所学课程
    ---- ---- ----------------------------
    001  张三    语文 数学 英语
    002  李四    语文(2 行受影响)
      

  2.   

    以上适用于sql2005及以上的版本
    --sql2000用函数
    create function [dbo].[f_str](@sid varchar(20))
    returns varchar(50)
    as
    begin
      declare @s varchar(800)
      select @s=isnull(@s+' ','')+course
      from Tcourse
      where sid=@sid
      return @s
    end
    go-->查询
    select b.sid as 学号,a.sname as 姓名,
    所学课程=dbo.f_str(b.sid)
    from Tstudent a 
    join Tcourse b on a.sid=b.sid
    group by b.sid,a.sname/**
    学号   姓名   所学课程
    ---- ---- --------------------------------------------------
    001  张三   语文 数学 英语
    002  李四   语文(2 行受影响)
    **/
     
      

  3.   


    create table Tstudent(id int,sid varchar(50),sname nvarchar(50))
    go
    create table Tcourse(id int,sid varchar(50),course nvarchar(50))
    goinsert into Tstudent
    select   1, '001', N'张三' union all
    select   2, '002', N'李四'insert into Tcourse
    select    1, '001', N'语文' union all
    select    2, '002', N'语文' union all
    select    3, '001', N'数学' union all
    select    4, '001', N'英语'
    SELECT *
    FROM(
        SELECT DISTINCT 
            sid
        FROM (select a.sid,a.sname,b.course from Tstudent a,Tcourse b
    where a.sid=b.sid)T
    )A
    OUTER APPLY(
        SELECT 
            [values]= STUFF(REPLACE(REPLACE(
                (
                    SELECT course FROM (select a.sid,a.sname,b.course from Tstudent a,Tcourse b
    where a.sid=b.sid) N
                    WHERE sid = A.sid
                    FOR XML AUTO
                ), '<N course="', ','), '"/>', ''), 1, 1, '')
    )N
    -----------------------------------------
    001 语文,数学,英语
    002 语文