提问者:小点点

在对结果中的行进行编号之前删除重复记录


因此,我知道的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结果不同?

以下是基于以下公认答案的解决方案:

选择前#个参数。perpage#*从(

选择ROW_NUMBER()OVER(ORDER BY(SELECT 1))作为rownum,productdiagramid,productid,producttitle,totalRows=COUNT(*)OVER()FROM(

选择不同的productdiagramparts.productdiagramid作为productdiagramid,products.ID作为productdiagramid,products.Title作为producttitle从制造商内部连接Productors上的products.ID作为productdiagramparts.productdiagrams.ID,其中#WhereClause#

)_TMPDupRemove

)_TMPInlineView

其中rownum>#offset#ORDER BY producttitle


共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