SQL返回表格中的前十名,而不是所有结果中的前十名

时间:2017-12-12 16:16:30

标签: sql sql-server stored-procedures

我有简单的数据库设置3个表,一个中央产品存储库(产品),供应商列表以及他们提供的存储库中的哪些产品(Supplier_Product)以及商店列表以及他们从存储库中存储的产品( Site_Product)。

我需要一次返回分页 10个唯一产品,以及作为连接结果的任何其他供应商行和网站行。我得到了以下查询,它返回了10个产品,但它们显然不是唯一的,因为您可以将供应商1中的产品1和供应商2中的产品1包含在结果集中。

@Supplier_Id,@ Site_Id和@Search_Term用于过滤结果集。

为了清楚起见,我不打算在结果集中返回10行,而是10个产品 - 以及它们的相关供应商/网站信息另外作为重复的产品行。

我希望这是有道理的。

@Current_Page INT,
@Items_Per_Page INT = 10,
@Supplier_Id INT = NULL,
@Site_Id INT = NULL,
@Search_Term NVARCHAR(128) = NULL

SELECT P.Container_Noun, P.Open_Noun, P.Packaged, P.Product_Id, P.Product_Name, P.Quantity_Per_Package, P.Volume
SUP.Price, SUP.Supplier_Id, SUP.Supplier_Name,
SP.Site_Id, SP.Site_Name
FROM Product P
LEFT JOIN Supplier_Product SUP ON P.Product_Id = SUP.Product_Id
LEFT JOIN Site_Product SP ON P.Product_Id = SP.Product_Id
WHERE 
    (SUP.Supplier_Id = @Supplier_Id OR @Supplier_Id IS NULL) AND
    (SP.Site_Id = @Site_Id OR @Site_Id IS NULL) AND
    (P.Product_Name LIKE ('%' + @Search_Term + '%') OR @Search_Term IS NULL)
ORDER BY P.Product_Name ASC
OFFSET @Items_Per_Page *  (@Current_Page - 1) ROWS
FETCH NEXT @Items_Per_Page ROWS ONLY;

1 个答案:

答案 0 :(得分:1)

我真的希望这有效,因为我没有和你使用的相同。

如果您收到任何错误,请告诉我,我会尽力帮助您。

@Current_Page INT,
@Items_Per_Page INT = 10,
@Supplier_Id INT = NULL,
@Site_Id INT = NULL,
@Search_Term NVARCHAR(128) = NULL

with cte as (
    select distinct Product_Id
    FROM Product P
    LEFT JOIN Supplier_Product SUP ON P.Product_Id = SUP.Product_Id
    LEFT JOIN Site_Product SP ON P.Product_Id = SP.Product_Id
    WHERE 
        (SUP.Supplier_Id = @Supplier_Id OR @Supplier_Id IS NULL) AND
        (SP.Site_Id = @Site_Id OR @Site_Id IS NULL) AND
        (P.Product_Name LIKE ('%' + @Search_Term + '%') OR @Search_Term IS NULL)
    )

select P.Container_Noun, P.Open_Noun, P.Packaged, P.Product_Id, P.Product_Name, P.Quantity_Per_Package, P.Volume
SUP.Price, SUP.Supplier_Id, SUP.Supplier_Name,
SP.Site_Id, SP.Site_Name
FROM Product P
INNER JOIN (select Product_ID from cte ORDER BY Product_Id OFFSET @Items_Per_Page *  (@Current_Page - 1) ROWS FETCH NEXT @Items_Per_Page ROWS ONLY) PF ON P.Product_Id = PF.Product_Id
LEFT JOIN Supplier_Product SUP ON P.Product_Id = SUP.Product_Id
LEFT JOIN Site_Product SP ON P.Product_Id = SP.Product_Id
WHERE 
    (SUP.Supplier_Id = @Supplier_Id OR @Supplier_Id IS NULL) AND
    (SP.Site_Id = @Site_Id OR @Site_Id IS NULL) AND
    (P.Product_Name LIKE ('%' + @Search_Term + '%') OR @Search_Term IS NULL)

所以这里的诀窍是首先获得10个不同的Product_Id,然后使用它们来过滤原始查询中的结果。

如果您有任何问题,请与我们联系。