首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL返回表上的前10位,而不是所有结果的前10位。

SQL返回表上的前10位,而不是所有结果的前10位。
EN

Stack Overflow用户
提问于 2017-12-12 16:16:29
回答 1查看 78关注 0票数 1

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

我需要一次返回分页10唯一的产品,以及由于联接而增加的供应商行和站点行。我得到了下面的查询,它返回10个产品,但它们显然不是唯一的,因为您可以在结果集中包含供应者1的产品1和供应商2的产品1。

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

为了明确起见,我不想在结果集中返回10行,而是返回10种产品--以及它们的相关供应商/站点信息,作为重复的产品行。

我希望这是有意义的。

代码语言:javascript
运行
复制
@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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-12 17:01:40

我真的希望这是可行的,因为我没有您正在使用的相同的表。

如果你有任何错误,请告诉我,我会尽力帮助你。

代码语言:javascript
运行
复制
@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的第一个,然后使用它们在原始查询中筛选结果。

如果你有任何问题,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47777055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档