在MSSSQL2000中,如何实现如下查询:
字段1  字段2  字段2
 A      1       20
 A      2       30
 A      3       30 B      3       20
 B      1       30
 B      2       30结果:
 A      3       30
 B      2       30说明:
1. 按 字段1 取 字段3的值是最大值的行(会有多行)
2. 然后,再取 字段2 值是最大的行。我现在的做法是:
select a.字段1,a.字段3,max(b.字段2) 字段2
from(
select 字段1,max(字段3) 字段3
from 表1 
group by 字段1
)a
join 表1 b on a.字段1=b.字段1 and a.字段3=b.字段3请问,有没有效率比较高的查询?
因为我实际的查询比较复杂,表1是个比较复杂子查询,若是按上面的方式会很慢,上面只是为了说明问题。
请问如何实现?
谢谢

解决方案 »

  1.   

    这个效率不差 啊用 with ..as 试试.
      

  2.   

    在我印象中使用with会更快些,你试试看吧:
    with tb as
    (
      select 字段1,max(字段3) as 字段3 from 表1  
      group by 字段1
    )
    select 字段1,字段3,b.字段2
    from tb
    inner join 表1 b on tb.字段1=b.字段1 and tb.字段3=b.字段3思路是一样的。
      

  3.   

    select 字段1,max(字段2),right(max(cast(字段2 as char(10) +cast(字段3 as char(10)),10) as 字段3from 表1  
    group by 字段1
      

  4.   

    sql 2000 没有 with as 和 row_number吧?写起来比较麻烦。
    另:3楼虽然肯定错,但也提供个思路。
    我写个看看速度(不过这样写有个前提,字段2数字不会过大(我这里是不超10000就可以))
    select 字段1
    ,cast(right(cast(10000*字段3+字段2 as varchar(50)),4) as int) 字段2
    ,max(字段3) 字段3
    from 表1   
    group by 字段1
      

  5.   

    少个max...
    select 字段1
    ,cast(right(cast(max(10000*字段3+字段2) as varchar(50)),4) as int) 字段2
    ,max(字段3) 字段3
    from 表1   
    group by 字段1
      

  6.   

    select 后的字段2没有包含在group by 后面,这样语法应该是不对的。另:三楼的好像有点小问题,不过思路挺新颖,改一下应该可以:
    select 字段1,max(字段3),right(max(cast(字段3 as char(10) +cast(字段2 as char(10)),10) as 字段3
    from 表1   
    group by 字段1我先试试看 ,谢谢各位先