0

3 つのリンクされたエンティティ (タイトル > エディション > SKU) からのデータを含む SQL ビューがあります。このビューのデータは、3 つのエンティティ内の任意のフィールドを検索するために使用されます。たとえば、条件 title.regionid = '14' を指定すると、ビューは 4,000 の一意の行 (SKU ごとに 1 行) を返します。これらは、456 の一意のタイトルに属する 765 の一意のエディションに属します。

必要なのは、Row_Number() を使用してタイトルに基づいてページングを有効にすることです。そう

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

問題は、行列が SKU ではなくタイトルで行をカウントする必要があることです。そのため、4,000 行の結果セットから、最初のタイトルに 12 のエディションと 65 の SKU が含まれている場合、65 行すべての行番号は 1 になるはずです。それらは同じタイトルに属しているためです。

ビューに 40 以上の列が含まれているため、GroupBy を使用できません。すべての列を 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

最初のページには 4 つのタイトルにのみ属する 35 行がありますが、行列は行ごとにカウントされるため、そこで停止しますが、タイトルでカウントすると、ページ 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 に答える