摘抄一些关于数据库查询最后一条记录的语句

select * from table 
where rownum<(select count(*)+1 from table) 
minus 
select * from table 
where rownum<(select count(*) from table) 

也可以简化为 
select * from table 
minus 
select * from table 
where rownum<(select count(*) from table) 
效果是一样的 

切记rownum是伪列 只能用< 

顺便给你求第X行的通用SQL语句 
select * from table where rownum<X+1 
minus 
select * from table where rownum<X

 

SQL中intersect、union、minus和except 运算符

(2009-06-08 00:00:00)

1、intersect运算符
intersect运算符通过只包括 TABLE1  TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL  INTERSECT 一起使用时 (intersect  all),不消除重复行。
2、minus运算符
minus运算符通过只包括 TABLE1  TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 allminus一起使用时 (minus all),不消除重复行。
3、union运算符

union运算符是将两个或更多查询的结果组合为单个结果集 


table1:
f_name 

f_date
name1   2009-6-1
name2   2009-6-2

table2:
f_name  f_date
name3   2009-6-2
name4   2009-6-3

select f_date from table1 intersect select date from table2
结果:
name2   2009-6-2


select f_date from table1 union select f_date from table2
结果:

2009-6-1
2009-6-2
2009-6-3

注:except
只能用于SQLserver
在SQLserver中:
select f_date from table1 except select f_date from table2
结果:
2009-6-1
在oracle中用minus:
select f_date from table1 minus select f_date from table2
结果:
2009-6-1
 
 

SQLServer 实现rownum 的功能

 

今天想把最近做的项目的Oracle数据库换成SqlServer数据库,在转换的过程中出现一点问题,就是输出表的行号的时候出现了问题,在Oracle数据库中,可以直接通过它的rownum来完成,语句如下

select rownum as num,t.occurrenceid,t.occurrencenum2,t.registerdate,b.occtype,t.AMOUNT,t.occresult,t.occtime,t.yr,t.zi,t.hao,t.step as step from occurrence t left join occ_type b on t.occtypeid = b.occtypeid where t.step<3 and t.Departmentid='101000' order by t.registerdate desc

但是放到SqlServer2005中就会出错看,说是rownum有错误,最后才知道在SqlServer查询行号不是那样查的,是用SqlServer的row_number()来查询的

select row_number() over(order by t.registerdate desc) as num,t.occurrenceid,t.occurrencenum2,t.registerdate,b.occtype,t.AMOUNT,t.occresult,t.occtime,t.yr,t.zi,t.hao,t.step as step from occurrence t left join occ_type b on t.occtypeid = b.occtypeid where t.step<3 and t.Departmentid='101000'

解释:

1 此方法把括号里的查询结果放到变量:temp 里面( 我也不确定是不是变量), 并用row_number() 函数进行一个行号跟踪, 再用over 函数进行一个列的排序规则( 是这必须的), 并指定列名为'rownum'

2 紧接着在下面的语句可以对 'rownum' 进行一个指定行号的查询

 

 

其实显示序号除了采用sql处理外,我们也可以在程序代码中实现,比如sql2000可能使用sql就不行了,那么怎么办呢,可以看看下面的例子:

 

 
      string sql = "select * from jh_job where jh_check = 1 order by jh_pdate desc";
        DataTable dt = LYDAO.SqlText.ExecuteDataset(sql).Tables[0];

        DataColumn dc = new DataColumn("num");
        dt.Columns.Add(dc);
        for (int i = 0; i < dt.Rows.Count; i++)
        {


            DataRow row = dt.NewRow();
            int j=i+1;
            if (i < 10)
            {
              
            dt.Rows[i]["num"]= "0" + j;
            }
            else
            {
               
            dt.Rows[i]["num"]=j;
            }
        }

 
 

然后绑定dt,在页面中读出num即可..

posted on 2014-12-03 15:38  狂野的小怪兽  阅读(271)  评论(0编辑  收藏  举报