有两表:
a表,成绩表1
学号 姓名 语文 数学b表,成绩表2
学号 姓名 语文 数学现在要对这两个成绩表进行对比得出这样的一个结果:
学号(a表) 姓名(a表)  语文(a表) 语文(b表) 名次1(a表中的名次) 名次2(b表中的名次)这个sql语句如何写?(注两个表的人数可能会不一样,不过以a表为准)

解决方案 »

  1.   

    if you are using SQL Server, try something like (didn't test, so it might work):
    select a.学号, a.姓名, a.语文, b.语文, (select count(学号) from 成绩表1 where 语文 > a.语文)+1 as 名次1 ,  (select count(学号) from 成绩表2 where 语文 > b.语文)+1 as 名次2
    from 成绩表1 a
    left outer join 成绩表2 b
    where a.学号 = b.学号
      

  2.   

    sorry,changewhere a.学号 = b.学号
    ===>
    on a.学号 = b.学号
      

  3.   

    欠妥!其中
    (select count(学号) from 成绩表2 where 语文 > b.语文)+1 as 名次2
    不一定存在,因为b.语文可能为null,此时名次2应为null,而不是1.
    或者改为
    (case b.语文 when null then null else (select count(学号) from 成绩表2 where 语文 > b.语文)+1 ) as 名次2
       上述只用于SQLServer语法也许有误懒的查资料了,access可用iif表达式,
      

  4.   

    --SQL数据库中用:select a.学号 as [学号(a表)]
    ,a.姓名 as [姓名(a表)]
    ,a.语文 as [语文(a表)]
    ,b.语文 as [语文(b表)]
    ,a.名次 as [名次1(a表中的名次)]
    ,b.名次 as [名次2(b表中的名次)]
    from(
    select 学号,姓名,语文,数学
    ,(select count(*) from a表 where 语文+数学>=a.语文+a.数学) as 名次
    from a表 a) a left join(
    select 学号,姓名,语文,数学
    ,(select count(*) from a表 where 语文+数学>=a.语文+a.数学) as 名次
    from b表 a) b on a.学号=b.学号
      

  5.   

    忘了说了:
    第一这两个表是属于两个不同的文件中即A文件中有表a,B文件中有表b
    第二我是想用VB+ado来做不知能不能写出来!
    第三名次是指单学科的名次,即单指语文的名次,不是语文+数学的名次!不知现在有没有说清楚,不过先谢谢大家的指点!
      

  6.   

    现提供两种解决方案:
    1、用ADO生成一个新的数据库,把这两个文件中的表连接到其中,在两个新表中执行查询。表达式请稍候……
    2、分别用ADO连接这两个数据,把两个表中的数据读入内存,然后编一个过程,进行排序然后显示。代码请稍候……