平常工作,尤其是面試中經常遇到這樣一個問題,查詢表A中31到40條的記錄,ID可能是不連續的。(via:女孩禮物網)
-
- 如果ID連續
select * from A where ID between 31 and 40
- 如果ID不連續,提供三種寫法
--兩次對表A查詢效率較低 select top 10 * from A where ID not in (select top 30 ID from A)
--外層查詢沒有對表A查詢,效率大有提高 select top 10 * from (select top 40 * from A order by ID) as t order by t.ID desc--ROW_NUMBER()函數效率更高,sqlserver2005以及以上版本中才可以使用 select * from (select ROW_NUMBER() over(order by ID) as 'sequence',A.* from A ) as t where t.sequence between 31 and 40
- 如果ID連續
不知道還有沒有其他寫法,我在此拋出一塊磚 ……
不一會兒,就接到幾塊玉(期待更多的玉):
@金色海洋(jyk)陽光男孩
--如果是海量數據做查詢的話,這個是更高效的,這個不錯
select top 10 * from A where id in (select top 10 id from (select top 40 id from A order by ID desc) as t order by t.ID ) order by A.ID desc
@害怕飛的鳥
--這哥們給出了sql2012的新寫法,我機器上沒裝這么前衛的工具,在我老大的機器上測試可行,性能效率暫不明確
SELECT * FROM A Order by ID OFFSET 30 ROWS FETCH NEXT 10 ROWS ONLY
