[学生表]学号   姓名  成绩
003    张三   88
004    李四   99
005    王五   59
006    赵六   49[补考表]
学号   补考成绩   补考时间
005      67        2012-4-11
005      57        2012-4-10
005      68        2012-4-9 
006      69        2012-4-10
006      65        2012-4-9 要求一条语句联合查出最后考试成绩
学号   姓名   成绩  补考成绩  
003    张三   88     null
004    李四   99     null
005    王五   59      67
006    赵六   49      69------------------------------------------------------
 select * from [学生表] left join [补考表] on  [学生表].学号 = [补考表].学号 
我只会写到这步了..感觉好像要用 group by  还是做个补考表 的top 1  突然有点蒙了.

解决方案 »

  1.   


    --> 测试数据:[学生表]
    if object_id('[学生表]') is not null drop table [学生表]
    create table [学生表]([学号] varchar(3),[姓名] varchar(4),[成绩] int)
    insert [学生表]
    select '003','张三',88 union all
    select '004','李四',99 union all
    select '005','王五',59 union all
    select '006','赵六',49
    --> 测试数据:[补考表]
    if object_id('[补考表]') is not null drop table [补考表]
    create table [补考表]([学号] varchar(3),[补考成绩] int,[补考时间] datetime)
    insert [补考表]
    select '005',67,'2012-4-11' union all
    select '005',57,'2012-4-10' union all
    select '005',68,'2012-4-9' union all
    select '006',69,'2012-4-10' union all
    select '006',65,'2012-4-9'select a.学号,a.姓名,a.成绩,b.补考成绩 from [学生表] a 
    full join (
    select [学号],[补考成绩] from(
    select ROW_NUMBER()over(partition by 学号 order by [补考时间] desc) as id,*
    from [补考表])a where id=1
    )b on a.学号=b.学号
    /*
    学号 姓名 成绩 补考成绩
    003 张三 88 NULL
    004 李四 99 NULL
    005 王五 59 67
    006 赵六 49 69
    */
      

  2.   


    --> 测试数据: [学生表]
    if object_id('[学生表]') is not null drop table [学生表]
    create table [学生表] (学号 varchar(3),姓名 varchar(4),成绩 int)
    insert into [学生表]
    select '003','张三',88 union all
    select '004','李四',99 union all
    select '005','王五',59 union all
    select '006','赵六',49--> 测试数据: [补考表]
    if object_id('[补考表]') is not null drop table [补考表]
    create table [补考表] (学号 varchar(3),补考成绩 int,补考时间 datetime)
    insert into [补考表]
    select '005',67,'2012-4-11' union all
    select '005',57,'2012-4-10' union all
    select '005',68,'2012-4-9' union all
    select '006',69,'2012-4-10' union all
    select '006',65,'2012-4-9'
    select *,补考成绩=
    (select top 1 补考成绩 from [补考表] where 学号=t.学号) from [学生表] t
    /*
    学号   姓名   成绩          补考成绩
    ---- ---- ----------- -----------
    003  张三   88          NULL
    004  李四   99          NULL
    005  王五   59          67
    006  赵六   49          69
    */
      

  3.   

    我看他这个好像是补考成绩取事件最大的SELECT  *,补考成绩=
    (SELECT  TOP 1  补考成绩 FROM  [补考表] WHERE  学号=t.学号 ORDER BY [补考表].[补考时间] DESC) FROM  [学生表] t
      

  4.   

    果然高手 我确实弱 思路太死 另外如果我要多加一列怎么办法 比如 补考时间是不是再做一次SELECT  *,补考成绩=
    (SELECT  TOP 1  补考成绩 FROM  [补考表] WHERE  学号=t.学号 ORDER BY [补考表].[补考时间] DESC),补考时间=(SELECT  TOP 1  补考时间 FROM  [补考表] WHERE  学号=t.学号 ORDER BY [补考表].[补考时间] DESC) FROM  [学生表]