首页 新闻 赞助 找找看

通用SQL分页语句隐患问题(not in)

0
悬赏园豆:30 [已解决问题] 解决于 2015-05-17 21:04

select top 10 a.id,a.name,a.bid,b.id as bid1,b.name as bname from tableA a inner join tableB b on a.bid=b.id where a.id not in(select top 10 a.id from tableA a inner join tableB b on a.bid=b.id)

这句SQL分页语句看似没错,但是在有时候,他查出来的分页数据是不正确的,主句

'select top 10 a.id,a.name,a.bid,b.id as bid1,b.name as bname from tableA a inner join tableB b on a.bid=b.id'  与子句  ' select top 10 a.id from tableA a inner join tableB b on a.bid=b.id’有时候执行计划会不一样,原因是主句里面查询的字段多了连接表的字段b.id as bid1,b.name as bname。

从而引起两句查询出来的结果集不一样,造成分页数据有误,我就遇到这个问题过。不知道如何解决。求高手解释

sujiaya的主页 sujiaya | 初学一级 | 园豆:10
提问于:2013-01-09 12:52
< >
分享
最佳答案
0

select a.id,a.name,a.bid,b.id as bid1,b.name as bname from tableA a inner join tableB b on a.bid=b.id

最好的办法是先把这句做一个视图

然后再用row_number的方式来分页,效率最高

select * from (
select ROW_NUMBER() over(order by ID) as rid,* from 视图
) A where A.rid>=1 and A.rid<=10

收获园豆:30
Rich.T | 老鸟四级 |园豆:3440 | 2013-01-09 12:59
其他回答(6)
0

我觉得你这种分页方式也不是效率很高的那种,可以用如下这种效率相对你那种性能好的sql分页:

SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP 页大小*页数 id
                 FROM 表
ORDER BY id) AS T))
ORDER BY ID

http://www.itlearner.com/article/3740

悟行 | 园豆:12559 (专家六级) | 2013-01-09 12:56
0

哥哥  加个 排序Order by,要不然 你的 top 顺序无法保证,是有问题的。

Qlin | 园豆:2403 (老鸟四级) | 2013-01-09 13:13
0

楼上正解,加Order by排序

卒子 | 园豆:588 (小虾三级) | 2013-01-09 13:38
0

t-sql的就如二楼,pl-sql的貌似直接可以得到吧。

顾晓北 | 园豆:10844 (专家六级) | 2013-01-09 13:42
0

恩是你可以在两个句子中都加order by 或者直接在最后加,不过最好是两个都加

妍珊 | 园豆:1169 (小虾三级) | 2013-01-09 13:55
0

你的问题是高并发下查出来的数据可能不一样,是由于楼主采用了not in的方式。

解决办法是采用在一个临时区域中查询你想要的数据,一楼二楼的方式都可以,另外网上还给出一个存储过程的方式:http://www.jb51.net/article/23603.htm

滴答的雨 | 园豆:3681 (老鸟四级) | 2013-01-09 14:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册