2013-02-18 2 views
3

Так, я знаю достаточно просто SQL, чтобы быть опасным, и я следующий пример, чтобы тянуть стоит один страницы записей из таблицы:Удаление повторяющихся записей, прежде чем нумерации строк в результате

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 отличными до нумерации строк?

Вот решение на основе принятого ответа ниже:

Выбор TOP # arguments.perPage # * ОТ (

SELECT, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS ROWNUM, productdiagramid, ProductID, producttitle, totalRows = COUNT (*) НАД() ОТ (

SELECT DISTINCT productdiagramparts.productdiagramid AS productdiagramid, products.id AS ProductID, products.title А.С. producttitle от производителей INNER JOIN продукты ПО manufacturers.id = products.manufacturerid INNER JOIN productdiagramparts ПО products.id = productdiagramparts.productid INNER JOIN productdiagrams ПО productdiagramparts.productdiagramid = productdiagrams.id где # # WhereClause

) _tmpDupRemove

) _tmpInlineView

ГДЕ ROWNUM> # смещение # ORDER BY producttitle

+1

Я думаю, что вы на самом деле это overengineered. Когда я смотрю на ваш sql, я не могу сказать, на что вы хотите основать свои верхние n записей. Ты можешь? –

+0

Для лучшей помощи в удалении дубликатов нам понадобятся определения таблиц и примеры данных. –

ответ

1

Ниже приведен подход, который использует функцию ROW_NUMBER второй раз. Внутренний номер 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 
+0

У меня возникла синтаксическая ошибка, выполняющая ваш запрос, как показано на рисунке, но он указал мне на решение, которое должно было просто выполнить другой подзапрос, используя различные: –

0

Вы можете использовать статью GROUP BY.

Заказ в SQLServer: GROUP BY -> SELECT ROW_NUMBER() -> DISTINCT. Поэтому GROUP BY вместо DISTINCT вам нужен

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 
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] 
Смежные вопросы