zoukankan      html  css  js  c++  java
  • sql2005中生成行号[转]

    窗口函数,可用来直接生成行号。如:
    select ROW_NUMBER() over (order by ENo), ENo,EName
    from Employee
    select ROW_NUMBER() over (order by ENo), ENo,EName
    from Employee

    但是SQL Server 2000中是没有这个函数的,那除了迁移数据库版本外,有没有替代的解决方法呢?答案是肯定的。
    有两个思路

    1、使用临时表。
    如果是在存储过程中,这是一个不错的选择。
    创建一个临时表,其中除了需要的查询结果外,还一个记数列。查询结果放入临时表后(一般情况下可直接使用Insert into语句),用代码进行记数,更新记数列的值。
    在记数列数值的生成方法上,还有一个改进的办法是直接将该列定义为自增长字段。这样“记数”的代码也省掉了。

    2、采用自连接。
    如果是在代码中,不便于使用临时表,可以采用此方法。比如执行一个查询统计,需要一个替代的SQL语句。
    这个方法实际上是通过表的自连接给结果行“分等级”的思路来实现的。
    语句如下:
    select count(*),e1.ENo, e1.EName
    from Employee e1
    inner join Employee e2 on e1.ENo >= e2.ENo
    group by e1.ENo, e1.EName
    order by 1
    select count(*),e1.ENo, e1.EName
    from Employee e1
    inner join Employee e2 on e1.ENo >= e2.ENo
    group by e1.ENo, e1.EName
    order by 1

    或者把join条件放到where子句中:
    select count(*),e1.ENo, e1.EName
    from Employee e1, Employee e2,
    where e1.ENo >= e2.ENo
    group by e1.ENo, e1.EName
    order by 1
    select count(*),e1.ENo, e1.EName
    from Employee e1, Employee e2,
    where e1.ENo >= e2.ENo
    group by e1.ENo, e1.EName
    order by 1

    如果ENo字段值不重复,还可以这样写:
    select (select count(*) from Employee e2 where e1.ENo >= e2.ENo), e1.ENo, e1.EName
    from Employee e1
    order by 1
    select (select count(*) from Employee e2 where e1.ENo >= e2.ENo), e1.ENo, e1.EName
    from Employee e1
    order by 1

    如果ENo字段值有重复的情况,要使用最后一种写法可以将where条件变通一下,如:
    where e1.ENo+e1.EName >= e2.ENo+e2.EName
    总能找到不存在重复值的表达式的。
  • 相关阅读:
    WCF开发框架形成之旅---WCF的几种寄宿方式
    使用Winform程序作为WCF服务的宿主
    Winfrom 使用WCF 实现双工通讯
    WCF简单实例--用Winform启动和引用
    ASP.NET用QQ,网易发送邮件以及添加附件
    神经网络浅讲:从神经元到深度学习
    jQuery EasyUI combobox多选及赋值
    easyui combobox 带 checkbox 亲自验证
    天地图api地址
    1-3Controller之Response
  • 原文地址:https://www.cnblogs.com/flyrain/p/sql2000.html
Copyright © 2011-2022 走看看