SQL Server 常用分頁SQL

今天無聊和朋友討論分頁,發現網上好多都是錯的。網上經常查到的那個Top Not in 或者Max 大部分都不實用,很多都忽略了Order和性能問題。為此上網查了查,順帶把2000和2012版本的也補上了。

先說說網上常見SQL的錯誤或者說局限問題

1
2
3
4
5
select?top?10 *
from?table1
where?id?not?in(
????select?top?開始的位置 id
????from?table1)

這樣的確是可以取到分頁數據,但是這是默認排序的,如果要按其中一列排序呢?那order by 加在哪里呢?里外都加,顯然不行,外面的Order不起作用,只能嵌套,Oh my god,編程三個Select了,這效率。

為了好用效率高,總體思路還是老老實實的用RowNumber解決,但是SQL2000沒有RowNumber,其實我們可以通過臨時表自增列搞定,不多說,上例子。

?

SQL 2000 用臨時表解決,通過在臨時表中增加自增列解決RowNumber。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE?@Start?INT
DECLARE?@End?INT
SELECT?@Start = 14000,@End?= 14050
CREATE?TABLE?#employees (RowNumber?INT?IDENTITY(1,1),
LastName?VARCHAR(100),FirstName?VARCHAR(100),
EmailAddress?VARCHAR(100))
INSERT?INTO?#employees (LastName, FirstName, EmailAddress)
SELECT?LastName, FirstName, EmailAddress
FROM?Employee
ORDER?BY?LastName, FirstName, EmailAddress
SELECT?LastName, FirstName, EmailAddress
FROM?#employees
WHERE?RowNumber > @Start?AND?RowNumber <= @End
DROP?TABLE?#employees
GO

  


SQL 2005/2008 由于支持了Row_Number于是通過派生表的方式解決(兩個嵌套)

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE?@Start?INT
DECLARE?@End?INT
SELECT?@Start = 14000,@End?= 14050
SELECT?LastName, FirstName, EmailAddress
FROM?(SELECT?LastName, FirstName, EmailAddress,
ROW_NUMBER() OVER (ORDER?BY?LastName, FirstName, EmailAddress)?AS?RowNumber
FROM?Employee) EmployeePage
WHERE?RowNumber > @Start?AND?RowNumber <= @End
ORDER?BY?LastName, FirstName, EmailAddress
GO

  


SQL 2005/2008 或者用CTE的方式實現,和派生表一樣,就是好看點,執行計劃都一樣。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DECLARE?@Start?INT
DECLARE?@End?INT
SELECT?@Start = 14000,@End?= 14050;
WITH?EmployeePage?AS
(SELECT?LastName, FirstName, EmailAddress,
ROW_NUMBER() OVER (ORDER?BY?LastName, FirstName, EmailAddress)?AS?RowNumber
FROM?Employee)
SELECT?LastName, FirstName, EmailAddress
FROM?EmployeePage
WHERE?RowNumber > @Start?AND?RowNumber <= @End
ORDER?BY?LastName, FirstName, EmailAddress
GO

  


SQL SERVER 2012 比較給力支持了OFFSET,于是一個Select結束戰斗

1
2
3
4
5
SELECT?LastName, FirstName, EmailAddress
FROM?Employee
ORDER?BY?LastName, FirstName, EmailAddress
OFFSET 14000?ROWS
FETCH?NEXT?50?ROWS?ONLY;

  

?

最后說下,根據老外的文章,在2012里,如果前面加上TOP(50),那么執行計劃就會少讀很多行數據(讀的精準了),提高性能。但是鑒于本人手頭沒2012也無法測試。至少在2008R2上加不加TOP執行計劃都一樣。

轉載于:https://www.cnblogs.com/firstdream/p/7828858.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390826.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390826.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390826.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Word中摘要和正文同時分欄后,正文跑到下一頁,怎么辦?或Word分欄后第一頁明明有空位后面的文字卻自動跳到第二頁了,怎么辦?...

問題1&#xff1a;Word中摘要和正文同時分欄后&#xff0c;正文跑到下一頁&#xff0c;怎么辦&#xff1f;或Word分欄后第一頁明明有空位后面的文字卻自動跳到第二頁了&#xff0c;怎么辦&#xff1f; 答&#xff1a;在word2010中&#xff0c;菜單欄中最左側選“文件”->“選…

leetcode 664. 奇怪的打印機(dp)

題目 有臺奇怪的打印機有以下兩個特殊要求&#xff1a; 打印機每次只能打印由 同一個字符 組成的序列。 每次可以在任意起始和結束位置打印新字符&#xff0c;并且會覆蓋掉原來已有的字符。 給你一個字符串 s &#xff0c;你的任務是計算這個打印機打印它需要的最少打印次數。…

SQL數據類型說明和MySQL語法示例

SQL數據類型 (SQL Data Types) Each column in a database table is required to have a name and a data type. 數據庫表中的每一列都必須具有名稱和數據類型。 An SQL developer must decide what type of data that will be stored inside each column when creating a tab…

PHP7.2 redis

為什么80%的碼農都做不了架構師&#xff1f;>>> PHP7.2 的redis安裝方法&#xff1a; 順便說一下PHP7.2的安裝&#xff1a; wget http://cn2.php.net/distributions/php-7.2.4.tar.gz tar -zxvf php-7.2.4.tar.gz cd php-7.2.4./configure --prefix/usr/local/php…

leetcode 1787. 使所有區間的異或結果為零

題目 給你一個整數數組 nums??? 和一個整數 k????? 。區間 [left, right]&#xff08;left < right&#xff09;的 異或結果 是對下標位于 left 和 right&#xff08;包括 left 和 right &#xff09;之間所有元素進行 XOR 運算的結果&#xff1a;nums[left] XOR n…

【JavaScript】網站源碼防止被人另存為

1、禁示查看源代碼 從"查看"菜單下的"源文件"中同樣可以看到源代碼&#xff0c;下面我們就來解決這個問題&#xff1a; 其實這只要使用一個含有<frame></frame>標記的網頁便可以達到目的。 <frameset> <frame src"你要保密的文件…

梯度 cv2.sobel_TensorFlow 2.0中連續策略梯度的最小工作示例

梯度 cv2.sobelAt the root of all the sophisticated actor-critic algorithms that are designed and applied these days is the vanilla policy gradient algorithm, which essentially is an actor-only algorithm. Nowadays, the actor that learns the decision-making …

共享語義 unix語義_語義UI按鈕

共享語義 unix語義什么是語義UI按鈕&#xff1f; (What are Semantic UI Buttons?) A button indicates a possible user action. Semantic UI provides an easy-to-use syntax that simplifies not only the styling of a button, but also the natural language semantics.按…

垃圾回收算法優缺點對比

image.pngGC之前 說明&#xff1a;該文中的GC算法講解不僅僅局限于某種具體開發語言。 mutator mutator 是 Edsger Dijkstra 、 琢磨出來的詞&#xff0c;有“改變某物”的意思。說到要改變什么&#xff0c;那就是 GC 對象間的引用關系。不過光這么說可能大家還是不能理解&…

標準C程序設計七---77

Linux應用 編程深入 語言編程標準C程序設計七---經典C11程序設計 以下內容為閱讀&#xff1a; 《標準C程序設計》&#xff08;第7版&#xff09; 作者&#xff1a;E. Balagurusamy&#xff08;印&#xff09;&#xff0c; 李周芳譯 清華大學出版社…

leetcode 1190. 反轉每對括號間的子串

題目 給出一個字符串 s&#xff08;僅含有小寫英文字母和括號&#xff09;。 請你按照從括號內到外的順序&#xff0c;逐層反轉每對匹配括號中的字符串&#xff0c;并返回最終的結果。 注意&#xff0c;您的結果中 不應 包含任何括號。 示例 1&#xff1a; 輸入&#xff1a…

yolo人臉檢測數據集_自定義數據集上的Yolo-V5對象檢測

yolo人臉檢測數據集計算機視覺 (Computer Vision) Step by step instructions to train Yolo-v5 & do Inference(from ultralytics) to count the blood cells and localize them.循序漸進的說明來訓練Yolo-v5和進行推理(來自Ultralytics )以對血細胞進行計數并將其定位。 …

oauth2-server-php-docs 授權類型

授權碼 概觀 在Authorization Code交付式時使用的客戶端想要請求訪問受保護資源代表其他用戶&#xff08;即第三方&#xff09;。這是最常與OAuth關聯的授予類型。 詳細了解授權碼 用例 代表第三方來電履行 創建一個實例OAuth2\GrantType\AuthorizationCode并將其添加到您的服務…

flask框架視圖和路由_角度視圖,路由和NgModule的解釋

flask框架視圖和路由Angular vs AngularJS (Angular vs AngularJS) AngularJS (versions 1.x) is a JavaScript-based open source framework. It is cross platform and is used to develop Single Page Web Application (SPWA). AngularJS(版本1.x)是一個基于JavaScript的開源…

NGUI EventDelagate事件委托

using System.Collections; using System.Collections.Generic; using UnityEngine;public class BUttonClick : MonoBehaviour {public UIButton button_01;void Start(){if (button_01 null){Debug.Log("button組件丟失了");}else{//首先將腳本中的ClicktheButton…

leetcode 461. 漢明距離(位運算)

兩個整數之間的漢明距離指的是這兩個數字對應二進制位不同的位置的數目。 給出兩個整數 x 和 y&#xff0c;計算它們之間的漢明距離。 注意&#xff1a; 0 ≤ x, y < 231. 示例:輸入: x 1, y 4輸出: 2解釋: 1 (0 0 0 1) 4 (0 1 0 0)↑ ↑上面的箭頭指出了對應二進…

圖深度學習-第2部分

有關深層學習的FAU講義 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU’s YouTube Lecture “Deep Learning”. This is a full transcript of the lecture video & matching slides. We hope, you enjoy this as much as the videos. Of cou…

Linux下 安裝Redis并配置服務

一、簡介 1、 Redis為單進程單線程模式&#xff0c;采用隊列模式將并發訪問變成串行訪問。 2、 Redis不僅僅支持簡單的k/v類型的數據&#xff0c;同時還提供list&#xff0c;set&#xff0c;zset&#xff0c;hash等數據結構的存儲。 3、 Redis支持數據的備份&#xff0c;即mas…

大omega記號_什么是大歐米茄符號?

大omega記號Similar to big O notation, big Omega(Ω) function is used in computer science to describe the performance or complexity of an algorithm.與大O表示法相似&#xff0c;大Omega(Ω)函數在計算機科學中用于描述算法的性能或復雜性。 If a running time is Ω…

leetcode 477. 漢明距離總和(位運算)

theme: healer-readable 題目 兩個整數的 漢明距離 指的是這兩個數字的二進制數對應位不同的數量。 計算一個數組中&#xff0c;任意兩個數之間漢明距離的總和。 示例: 輸入: 4, 14, 2 輸出: 6 解釋: 在二進制表示中&#xff0c;4表示為0100&#xff0c;14表示為1110&…