最近学习数据库的分页算法,提到第一种
SELECT TOP 页大小 *
FROM table1WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id )ORDER BY idHumanResources.Employee是Adventrureworks里的表,一共290条数据
SELECT top 10 * FROM HumanResources.Employee a where EmployeeID not in (
SELECT TOP 200 EmployeeID order by EmployeeID) order by EmployeeID ;
执行结果正确,EmployeeID为201到210的数据查出来了
想到很多人不少EXISTS效率高吗?改一下
SELECT top 10 * FROM HumanResources.Employee a where not EXISTS (
SELECT TOP 200 EmployeeID FROM HumanResources.Employee where a.EmployeeID = EmployeeID order by EmployeeID ) order by EmployeeID;结果一条没有。很奇怪,找了好久,看了,才知道“in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询”。一直以来认为exists比in效率高的说法是不准确的。