一些比较难的sql问题:5

2014-11-24 14:10:00 · 作者: · 浏览: 0
一些比较难的sql问题:5
最近,在 论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
1、内连接后,如何分页。
sqlserver 对一张表进行分页查询,但是还要通过第二章张表获取信息
比如有一张表
create table Student(
sid int primary key identity(1,1) ,
sname varchar(15) not null
)
第二张表
create table Comment(
id int primary key identity(1,1) ,
sid int not null
)

我需要对第二张表comment 进行分页查询,但是还要通过第一张表查询姓名
要改如何写sql代码
我用内连接后接下来该如何做。
我的解法:
[sql] 
declare @page_size int;  
declare @page_num int;  
  
--比如:每页10条记录  
set @page_size = 10;  
  
--比如:先取第1页  
set @page_num = 1;  
  
select id,sid,sname  
from  
(  
select c.id,  
       c.sid,  
       s.sname,  
         
       --这里按照@@servername来排序,  
       --你可以根据需要按照id,sid,sname等字段来排序  
       (row_number() over(order by @@servername) - 1) / @page_size as rownum  
from commet c  
inner join student s  
        on c.sid = s.sid  
)t  
where rownum = @page_num - 1  

由于没有实验数据,下面通过sys.objects来实现:
[sql] 
declare @page_size int;  
declare @page_num int;  
  
--比如:每页10条记录  
set @page_size = 10;  
  
--比如:先取第1页  
set @page_num = 1;  
  
select *  
from  
(  
select *,     
       row_number() over(order by @@servername) as rownum,  
       --这里按照@@servername来排序,  
       --你可以根据需要按照id,sid,sname等字段来排序  
       (row_number() over(order by @@servername) - 1) / @page_size as pagenum  
from sys.objects  
)t  
where pagenum = @page_num - 1  

2、group by trueName后,返回不尽相同的userName,也就是userName字段的值需要一定的随机性,然后求score的总和。
我的解法:
[sql] 
if object_id('tb') is not null drop table tb  
go   
  
create table tb([id] int,[trueName] varchar(4),[userName] varchar(3),[score] int)  
  
insert tb  
select 1,'张三','zs',80 union all  
select 2,'张三','zs1',100 union all  
select 3,'张三','zs2',90 union all  
select 1,'李四','zs',80 union all  
select 2,'李四','zs1',100 union all  
select 3,'李四','zs2',90  
  
--第1次运行  
select *  
from  
(  
select truename,  
       username,  
       row_number() over(partition by truename order by checksum(newid())) as rownum,  
       sum(score) over(partition by truename) as score  
from tb  
)a  
where a.rownum = 1  
/*  
truename username rownum               score  
-------- -------- -------------------- -----------  
李四       zs1      1                    270  
张三       zs2      1                    270  
*/  
  
--第2次运行  
/*  
truename username rownum               score  
-------- -------- -------------------- -----------  
李四       zs2      1                    270  
张三       zs       1                    270  
*/