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。
从而引起两句查询出来的结果集不一样,造成分页数据有误,我就遇到这个问题过。不知道如何解决。求高手解释
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
我觉得你这种分页方式也不是效率很高的那种,可以用如下这种效率相对你那种性能好的sql分页:
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
哥哥 加个 排序Order by,要不然 你的 top 顺序无法保证,是有问题的。
楼上正解,加Order by排序
t-sql的就如二楼,pl-sql的貌似直接可以得到吧。
恩是你可以在两个句子中都加order by 或者直接在最后加,不过最好是两个都加
你的问题是高并发下查出来的数据可能不一样,是由于楼主采用了not in的方式。
解决办法是采用在一个临时区域中查询你想要的数据,一楼二楼的方式都可以,另外网上还给出一个存储过程的方式:http://www.jb51.net/article/23603.htm