0

我有一个 sql 视图,其中包含来自 3 个链接实体(标题 > 版本 > SKU)的数据。此视图中的数据用于搜索 3 个实体中的任何字段。例如,如果您指定条件 title.regionid = '14',则视图返回 4,000 个唯一行(每个 SKU 1 个),它们属于 765 个唯一版本,这些版本属于 456 个唯一标题。

我需要的是使用 Row_Number() 启用基于标题的分页。所以

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

问题是我的 Row 列需要按 Title 计算行数,而不是按 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 个标题,但是 Row 列按行计数,所以它停在那里,而如果它按标题计数,我会得到第 1 页的 387 行......我怎样才能完成分页这个情况?

4

2 回答 2

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
于 2013-04-11T23:41:35.457 回答
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

于 2017-11-01T18:10:30.180 回答