成绩表 A :学号(Number)<主键>、成绩(Score)
学生表 B: 学号(Number)<主键>、姓名(Name)、班级(Class)
求出每个班的分数第二名的姓名。

解决方案 »

  1.   


    select distinct name
    from a join b on a.number=b.number
    where Score in (select top 2 Score from a where number=b.number order by Score desc)
      

  2.   


    select distinct name
    from a join b on a.number=b.number
    where (select count(distinct Score) from a where number=a.number and Score>a.Score)=1
      

  3.   


    --别名错了
    select distinct name
    from a as t join b on t.number=b.number
    where (select count(distinct Score) from a where number=t.number and Score>t.Score)=1
      

  4.   

    select tb.Number,tb.Name,tb.Class,ta.Score
    from a as ta
    left join b as tb
    on ta.Number = tb.Number
    where (select count(1) from a,b where a.number = b.number and b.Class= tb.Class and a.Score >=ta.Score) = 2
      

  5.   

    CREATE TABLE #A (S_NO VARCHAR(10),S_NUM INT)
    INSERT INTO #A SELECT 101,80
    INSERT INTO #A SELECT 102,65
    INSERT INTO #A SELECT 103,80
    INSERT INTO #A SELECT 104,75
    INSERT INTO #A SELECT 105,95
    INSERT INTO #A SELECT 106,88
    INSERT INTO #A SELECT 107,90CREATE TABLE #B (S_NO VARCHAR(10),S_NAME VARCHAR(10),S_CLASS VARCHAR(10))
    INSERT INTO #B SELECT 101,'A','A01'
    INSERT INTO #B SELECT 102,'B','A01'
    INSERT INTO #B SELECT 103,'C','A01'
    INSERT INTO #B SELECT 104,'D','A02'
    INSERT INTO #B SELECT 105,'E','A02'
    INSERT INTO #B SELECT 106,'F','A02'
    INSERT INTO #B SELECT 107,'G','A01'
    SELECT A.S_NO,B.S_NAME,B.S_CLASS,A.S_NUM INTO #C  FROM #A A LEFT JOIN #B B ON A.S_NO=B.S_NOSELECT * FROM #C A
    WHERE (SELECT COUNT(*) FROM #C WHERE S_CLASS=A.S_CLASS AND S_NUM>A.S_NUM)<2
    AND  EXISTS (SELECT 1 FROM #C WHERE S_CLASS=A.S_CLASS AND S_NUM>A.S_NUM )
    DROP TABLE #A,#B,#C
    /**
    S_NO       S_NAME     S_CLASS    S_NUM       
    ---------- ---------- ---------- ----------- 
    101        A          A01        80
    103        C          A01        80
    106        F          A02        88
      

  6.   


    select Name from B join A on B.Number = A.Number where A.Score = (
       select top 1 Score from (select distinct top 2 Score from A order by Score desc) as T order by Score
    )
      

  7.   

    本帖最后由 roy_88 于 2008-11-28 18:22:03 编辑
      

  8.   

    select  姓名
    from
    (
    select  姓名,Row_number()over(partition by 班级,学号 order by 成绩) as num
    from
    (select 学生表.学号 as 学号 ,学生表.班级 as 班级, 学生表.姓名  as 姓名, 成绩表.成绩 as 成绩
    from 成绩表,学生表
    where 学生表.学号=成绩表.学号 ) as AA ) AS Tabwhere num = 2
      

  9.   

    CREATE TABLE #A (S_NO VARCHAR(10),S_NUM INT)
    INSERT INTO #A SELECT 101,80
    INSERT INTO #A SELECT 102,65
    INSERT INTO #A SELECT 103,80
    INSERT INTO #A SELECT 104,75
    INSERT INTO #A SELECT 105,95
    INSERT INTO #A SELECT 106,88
    INSERT INTO #A SELECT 107,90CREATE TABLE #B (S_NO VARCHAR(10),S_NAME VARCHAR(10),S_CLASS VARCHAR(10))
    INSERT INTO #B SELECT 101,'A','A01'
    INSERT INTO #B SELECT 102,'B','A01'
    INSERT INTO #B SELECT 103,'C','A01'
    INSERT INTO #B SELECT 104,'D','A02'
    INSERT INTO #B SELECT 105,'E','A02'
    INSERT INTO #B SELECT 106,'F','A02'
    INSERT INTO #B SELECT 107,'G','A01'
    SELECT A.S_NO,B.S_NAME,B.S_CLASS,A.S_NUM INTO #C  FROM #A A LEFT JOIN #B B ON A.S_NO=B.S_NOSELECT * 
    FROM #C A
    WHERE (SELECT COUNT(DISTINCT S_NUM) FROM #C WHERE  S_CLASS=A.S_CLASS AND S_NUM<A.S_NUM)=1
    DROP TABLE #A,#B,#C