1. 程式人生 > >mssql Row_Number() 分頁 DISTINCT 問題

mssql Row_Number() 分頁 DISTINCT 問題

這周碰到了很多奇怪的問題,有些是莫名的低階錯誤,有些這是一直以來未發現的錯誤。其中這個RowNumber()這個問題就是這樣。

敬德兄寫的底層負責自動生成T-SQL。當我需求對資料DISTINCT的時候就發現RowNuber() 和DISTINCT是有衝突的。

WITH ListOrder AS
(SELECT DISTINCT A.*,ROW_NUMBER() AS RowNumber FROM MyList A INNER JOIN MyListShop B ON A.ListID =B.ListID)
SELECT TOP 20 *  FROM ListOrder WHERE RowNumber > 80

這個效果是明顯不能排除DISTINCT的,因為 RowNumber這一列已經永遠不會相同了。

這樣就面臨兩個問題,第一我改變T-SQL,第二或者敬德更改通用的底層。

兩種我們想過的實現方法我都記錄一下:

T-SQL改進(不一定適合所有的業務):

 EXISITS(SELECT * FROM MyListShop WHERE ShopID= @ShopID)

(PS:敬德認為我原來的JOIN方式不合理,改用上面的EXISITS方式,更合理,我保留意見。但就目前的底層結構,如果要DISTINCT也只能EXISISTS方式)

通用底層改進(指定具體的DISTINCT列就可以了):

WITH ListOrder AS
(SELECT A.*,ROW_NUMBER() OVER (ORDER BY A.ListID) AS RowNumber FROM MyList A INNER JOIN MyListShop B ON A.ListID =B.ListID)
SELECT DISTINCT TOP 10 ListID,Title FROM ListOrder WHERE RowNumber > 20

看下來你可能會覺得不清楚,這是因為我省略了很多關於我們底層的實現。這裡主要為了說明一個問題,就是在使用Row_Number()寫通用分頁方法時,應該考慮DISTINCT的問題。因為我發現網上很多寫Row_Number分頁的情況都沒考慮這點,難道大家就都沒碰到這個問題,還是大家都沒有去實踐。

相關推薦

mssql Row_Number() DISTINCT 問題

這周碰到了很多奇怪的問題,有些是莫名的低階錯誤,有些這是一直以來未發現的錯誤。其中這個RowNumber()這個問題就是這樣。 敬德兄寫的底層負責自動生成T-SQL。當我需求對資料DISTINCT的時候就發現RowNuber() 和DISTINCT是有衝突的。 WITH ListOrder AS(SE

MSSQL資料庫儲存過程

create procedure [dbo].[p_splitpage] @sql nvarchar(4000), @currentpage int=2, @pagesize int=10, @recordcount int=0 output, @pagecount int=0 out

row_number()返回結果順序不確定

之前通過row_number()實現分頁查詢時: select top [PageSize] * from (   select row_number() over (order by id desc) as RowNum,* from table ) as A w

MSSQL查詢儲存過程

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go --分頁儲存過程 CREATE PROCEDURE [dbo].[sp_Paging] ( @Tables nvarchar(1000),

使用 row_number 進行sqlserver

info sele wid not in lse sqlserver ID from BE 例子: select top 5* from (SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* FROM Customer

sqlserver中使用row_number進行,效率很高!速度很快!

                  最近,童鞋要做一個分頁,資料量很大,幾十萬條資料,更坑爹的是,還是要經過表連線進行查詢,速度慢得像烏龜!!                  怎麼進行優化,可以讓

SQL 高效(百萬條資料)ROW_NUMBER() OVER (ORDER BY id) |

第一種方法:效率最高 SELECT TOP 頁大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,

Oracle row_number() over()解析函式高效實現

1. Oracle的分頁查詢語句基本上可以按照本文給出的格式來進行套用。 分頁查詢格式(有order by ---三層sql): SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME

row_number() over 兩表連線SQL 一對多的表關係 去重

--總條數 SELECT COUNT(1) FROM dbo.osaleh INNER JOIN dbo.osaled ON dbo.osaleh.osaleh_osalehID=dbo.osaled.osaled_osalehID WHERE --兩表連線分頁

Sqlserver使用ROW_NUMBER()函數進行數據

數據庫 原創 操作 數據分頁 格式 怎麽辦 ref 怎麽 一起 在Sqlserver數據庫中,如果查詢表中含有自增長Id列,一般會采用select Top的方式來數據的分頁操作。而實際上很多數據表設計的時候,不一定含有自增長Id列,那麽數據庫沒有Id自增列的時候要對數據分頁

海量的簡單分析

elk mic als emc usb won tm4 pop iap 此文僅個人理解,不到之處望指出 提出:easyui的datagrid組件有海量分頁的內容,通過查詢數據庫的所有數據在表格進行分頁瀏覽,因為數據量多,也叫海量分頁, 網

mysql進階(二)之細談索引、與慢日誌

連表 組合索引 rar 偏移量 最小值 num glob 要求 for 索引 1、數據庫索引   數據庫索引是一種數據結構,可以以額外的寫入和存儲空間為代價來提高數據庫表上的數據檢索操作的速度,以維護索引數據結構。索引用於快速定位數據,而無需在每次訪問數據庫表時搜索數據

步步為營-46-顯示的SQL語句

pid right user http play 技術分享 isp class 多少 說明:分頁顯示在實際業務中經常需要用到,其SQL語句分兩種 --方法一:跳過多少行,選中多少行 --每頁n條,選擇第m頁--n=2 m=3 --select top(n) * from

Python學習day13 Django /Session/Cookie

min art .post sso quest mit out -- asset Created on 2017年5月3日 第1課:上節作業簡介 鼠標放上表單後進入編輯模式-----需學習----CMDB裏會學到模態對話框裏--彈出對話框---對後臺進行操作---方式:1

Asp 解析 XML並顯示

request pow 1.8 blank -h syn obj margin normal Asp 解析 XML並分頁顯示 Asp 解析 XML並分頁顯示,演示樣例源代碼例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTM

mvc,EntityFramework調用存儲過程

mic frame play dbcontext style news logs con procedure 此文講述mvc4+entityframework6+sqlserver2008環境下調用存儲過程,實現分頁。 1、分頁存儲過程代碼如下: 分頁原理用的row_num

php簡單

bsp page glob mysql query 當前頁 emp gen limit <?php include(‘conn.php‘); $sql = "select id from user"; //$totalsize = tota

Oracle 中的sql函數以及

轉換 通用 pro page 大寫 example 分享 bstr case SELECT LPAD(‘Page 1‘,15,‘*.‘) "LPAD example" FROM DUAL; 1.分頁查詢 (1)方法一:使用 between and

HBase多條件及查詢的一些方法

nosql數據庫 應用場景 實現簡單 信息 byte 多條 多個 不可用 寫性能 HBase是Apache Hadoop生態系統中的重要一員,它的海量數據存儲能力,超高的數據讀寫性能,以及優秀的可擴展性使之成為最受歡迎的NoSQL數據庫之一。它超強的插入和讀取性能與它的數據

3.6 Lucene基本檢索+關鍵詞高亮+

trac 16px b- 標註 enter author amp 影響 重要 3.2節我們已經運行了一個Lucene實現檢索的小程序,這一節我們將以這個小程序為例,講一下Lucene檢索的基本步驟,同時介紹關鍵詞高亮顯示和分頁返回結果這兩個有用的技巧。 一、Lucene檢索