したがって、私は危険な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