2013-04-11 155 views
0

我有一個包含來自3個鏈接實體(標題>版本> SKU)的數據的sql視圖。該視圖中的數據用於在3個實體內的任何字段上進行搜索。例如,如果指定條件title.regionid ='14',則視圖將返回4,000個唯一行(每個SKU 1個),屬於765個唯一版本,屬於456個唯一標題。基於列值的變化遞增Row_Number

我需要的是使用Row_Number()啓用基於標題的分頁。所以

SELECT * FROM myview WHERE title.regionid = '14' AND Row BETWEEN 0 AND 35 

的問題是,我的行列需要數由標題行,而不是由SKU,因此從結果集的4000行,如果第一個標題中包含12個版本和65級的SKU,行號對於所有65行應該是1,因爲它們屬於相同的標題。

我無法使用GroupBy,因爲我的視圖包含40多列,所有這些列都可以通過WHERE子句進行搜索。

這裏的查詢:

SELECT * 
FROM (
SELECT row_number() OVER (ORDER BY a.TitleSort ASC) AS Row, a.* 
FROM (SELECT * FROM v_AdvancedSearch 
WHERE 
    istitledeleted = 0 
    --AND ISBN = '1-4157-5842-5' 
    --AND etc 
    ) AS a 
) d 
WHERE 
Row BETWEEN 0 AND 35 

在第一頁中有35行只屬於4個標題,而是鱗次櫛比的列數,因此停在那裏,而如果按標題計我會在頁面1中獲得387行...在這種情況下如何完成分頁?

+0

嘗試(PARTITION BY a.Title ORDER BY a.TitleSort ASC).. –

+0

PARTITION BY將增加所有行內的給定標題,所以如果標題有40個單品,行號會去從1到40,然後當標題更改時,下一個標題的行號將重置爲1。但那不是我想要的。 – pnduke

+1

請參閱[dense_rank()over()](http://msdn.microsoft.com/en-us/library/ms173825%28v=sql.105%29.aspx)。它會爲相同的TitleSort產生相同的數字,並且不會像rank()over()那樣產生間隙。 –

回答

0
WITH Titles AS 
(
SELECT * 
FROM (
SELECT row_number() OVER (ORDER BY a.TitleSort ASC) AS Row, a.* 
    FROM (SELECT DISTINCT TitleSORT, TitleId FROM v_AdvancedSearch 
    WHERE 
     istitledeleted = 0 
     --AND ISBN = '1-4157-5842-5' 
     --AND PictureFormat = 'Widescreen' 
     --AND UPC = '0-9736-14381-6-0' 
     --AND Edition = 'Standard' 
     ) AS a 
) d 
WHERE 
Row BETWEEN 0 AND 35 
) 
SELECT * FROM v_AdvancedSearch V 
INNER JOIN Titles ON Titles.TitleId = V.TitleId 
WHERE istitledeleted = 0 
--CONDITIONS NEED TO BE REPEATED HERE 
--AND ISBN = '1-4157-5842-5' 
ORDER BY V.TitleSort ASC 
0

這種形式最適合我

WITH 
[cte] AS ( 
    SELECT 
     DENSE_RANK () OVER (ORDER BY [v].[TitleSort], [v].[TitleId]) AS [ordinal], 
     [v].[TitleSort], 
     [v].[TitleId] 
     --, 
     --field list, 
     --etc 
    FROM [v_AdvancedSearch] AS [v] 
    WHERE 
     [v].[istitledeleted] = 0 
     --AND 
     --additional conditions AND 
     --etc 
) 
SELECT 
    [v].[ordinal], 
    [v].[TitleSort], 
    [v].[TitleId] 
    --, 
    --field list, 
    --etc 
FROM [cte] AS [v] 
WHERE 
    [v].[ordinal] >= 0 AND 
    [v].[ordinal] <= 35 
ORDER BY [v].[ordinal]; 
  • 無需DISTINCT或GROUP BY
  • 沒有必要重複的標準條件
  • 只是得有一個明確的字段列表

https://docs.microsoft.com/en-us/sql/t-sql/functions/dense-rank-transact-sql

https://www.google.com/search?q=%22sql+server%22+%22select+star%22