3

したがって、私は危険なSQLを十分に知っており、テーブルから1ページ分のレコードを取得する例に従っています。

SELECT TOP #arguments.perPage# * FROM (

SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rownum, productdiagramparts.productdiagramid AS productdiagramid, products.id AS productid, products.title AS producttitle, totalRows = COUNT(*) OVER()
FROM manufacturers
INNER JOIN products ON manufacturers.id = products.manufacturerid
INNER JOIN productdiagramparts ON products.id = productdiagramparts.productid
INNER JOIN productdiagrams ON productdiagramparts.productdiagramid = productdiagrams.id
WHERE #whereClause#
) _tmpInlineView

WHERE rownum > #offset#
ORDER BY producttitle

もちろん、これをラップしたSELECT TOPは、現在のページのレコードだけをプルします。問題は、削除したい最も内側のSELECTステートメントに重複がありますが、外部クエリの行にすでに番号が付けられているため、DISTINCTの使用は上記のように機能しません。行に番号を付ける前に、最も内側のSELECT結果を区別するにはどうすればよいですか?

以下の受け入れられた回答に基づく解決策は次のとおりです。

SELECT TOP#arguments.perPage#* FROM(

SELECT ROW_NUMBER()OVER(ORDER BY(SELECT 1))AS rownum、productdiagramid、productid、producttitle、totalRows = COUNT(*)OVER()FROM(

SELECT DISTINCT productdiagramparts.productdiagramid AS productdiagramid、products.id AS productid、products.title AS producttitle FROM Manufacturers INNER JOIN products ON Manufacturers.id = products.manufacturerid INNER JOIN productdiagramparts ON products.id = productdiagramparts.productid INNER JOIN productdiagrams ON productdiagramparts.productdiagramid = productdiagrams.id WHERE#whereClause#

)_tmpDupRemove

)_tmpInlineView

WHERE rownum>#offset#ORDER BY producttitle

4

3 に答える 3

1

ROW_NUMBERこれは、この関数を2回使用するアプローチです。最も内側SELECTには、重複のグループに基づいて行番号が割り当てられます。次に、重複を削除するために、行番号が1の行のみが返されます。そして最後に、行番号を割り当てるプロセスが実行されます。

SELECT TOP #arguments.perPage# *
FROM (

    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rownum,
        productdiagramparts.productdiagramid AS productdiagramid, 
        products.id AS productid, products.title AS producttitle, totalRows = COUNT(*) OVER()
    FROM (

        SELECT ROW_NUMBER() OVER PARTITION BY productdiagramparts.productdiagramid, products.id ORDER BY (SELECT 1)) AS dup_sequence, *
        FROM manufacturers
        INNER JOIN products ON manufacturers.id = products.manufacturerid
        INNER JOIN productdiagramparts ON products.id = productdiagramparts.productid
        INNER JOIN productdiagrams ON productdiagramparts.productdiagramid = productdiagrams.id
        WHERE #whereClause#

        ) _tmpDupRemove
    WHERE dup_sequence = 1

    ) _tmpInlineView

WHERE rownum > #offset#
ORDER BY producttitle
于 2013-02-18T16:35:24.907 に答える
0

GROUPBY句を使用できます。

SQLServerでの順序:GROUP BY-> SELECT ROW_NUMBER()->DISTINCT。したがって、DISTINCTではなくGROUPBYが必要です。

SELECT TOP #arguments.perPage# * FROM (
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rownum, 
       productdiagramparts.productdiagramid AS productdiagramid, 
       products.id AS productid, 
       products.title AS producttitle, 
       totalRows = COUNT(*) OVER()
FROM manufacturers
INNER JOIN products ON manufacturers.id = products.manufacturerid
INNER JOIN productdiagramparts ON products.id = productdiagramparts.productid
INNER JOIN productdiagrams ON productdiagramparts.productdiagramid = productdiagrams.id
GROUP BY productdiagramparts.productdiagramid, products.id, products.title
WHERE #whereClause#
) _tmpInlineView
WHERE rownum > #offset#
ORDER BY producttitle
于 2013-02-18T16:43:50.353 に答える
0
DECLARE @startrow Int = 0
DECLARE @recsperpage Int = 10


SELECT  [Inner2].[productdiagramid], 
        [Inner2].[productid], 
        [Inner2].[producttitle]
FROM        
    (
    SELECT ROW_NUMBER() OVER 
        (ORDER BY  
              [Inner1].[producttitle]) AS [ROW_NUMBER], 
        [Inner1].[productdiagramid], 
        [Inner1].[productid], 
        [Inner1].[producttitle]
    FROM
        (
        SELECT DISTINCT pdp.productdiagramid, p.id as productid, p.title as producttitle
        FROM manufacturers m
        INNER JOIN products p ON m.id = p.manufacturerid
        INNER JOIN productdiagramparts pdp ON p.id = pdp.productid
        INNER JOIN productdiagrams pd ON pdp.productdiagramid = pd.id
        WHERE #whereclause#
        ) AS Inner1
    ) as Inner2
WHERE Inner2.[ROW_NUMBER] BETWEEN @startrow + 1 AND  @startrow + @recsperpage
ORDER BY [Inner2].[ROW_NUMBER]
于 2013-02-18T17:59:41.417 に答える