交叉查询

最基本的处理方法:  
 
如果表中有主键(记录不重复的字段也可以),可以用类似下面的方法,当然x,y要换成具体的数字,不能用变量:  
 
select  top  y  *  from  表  where  主键  not  in(select  top  (x-1)*y  主键  from  表)  
 
 
 
如果表中无主键,可以用临时表,加标识字段解决.这里的x,y可以用变量.  
 
select  id=identity(int,1,1),*    into  #tb  from  表  
select  *  from  #tb  where  id  between  (x-1)*y  and  x*y-1  
---------------------------------------------------------------  
 
--完善一点的,用存储过程实现的通用过程.  
 
/*--用存储过程实现的分页程序  
 
           显示指定查询结果的第X页  
           此存储过程针对无主键的情况,使用临时表的方法  
           如果有主键,不推荐此方法  
 
--邹建  2003.09--*/  
 
/*--调用示例  
           exec  p_show  'select  *  from  xzkh_new..地区资料'  
 
           exec  p_show  'select  *  from  xzkh_new..地区资料',5,2,'地区编号,地区名称,助记码','地区编号'  
--*/  
 
if  exists  (select  *  from  dbo.sysobjects  where  id  =  object_id(N'[dbo].[p_show]')  and  OBJECTPROPERTY(id,  N'IsProcedure')  =  1)  
drop  procedure  [dbo].[p_show]  
GO  
 
CREATE  Proc  p_show  
@QueryStr  nvarchar(1000),            --查询语句,如果查询表,用:select  *  from  表  
@PageSize  int=10,                                    --每页的大小(行数)  
@PageCurrent  int=1,                                    --要显示的页  
@FdShow  nvarchar  (1000)='',            --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段  
@FdOrder  nvarchar  (1000)=''            --排序字段列表  
as  
declare  @FdName  nvarchar(50)            --标识列名  
           ,@Id1  varchar(20),@Id2  varchar(20)            --开始和结束的记录号  
select  @FdName='[ID_'+cast(newid()  as  varchar(40))+']'  
           ,@Id1=cast(@PageSize*(@PageCurrent-1)  as  varchar(20))  
           ,@Id2=cast(@PageSize*@PageCurrent-1  as  varchar(20))  
           ,@FdShow=case  isnull(@FdShow,'')  when  ''  then  '*'  else  @FdShow  end  
           ,@FdOrder=case  isnull(@FdOrder,'')  when  ''  then  ''  else  '  order  by  '+@FdOrder  end  
 
exec('select  '+@FdName+'=identity(int,0,1),'+@FdShow+'  
                       into  #tb  from('+@QueryStr+')  a  '+@FdOrder+'  
           select  '+@FdShow+'  from  #tb  where  '+@FdName+'  between  '  
           +@Id1+'  and  '+@Id2  
           )  
GO  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值