SQL Server:SELECT 查询以获取 DISTINCT 和 MAX 显示顺序值

Posted

技术标签:

【中文标题】SQL Server:SELECT 查询以获取 DISTINCT 和 MAX 显示顺序值【英文标题】:SQL Server : SELECT query to get DISTINCT and MAX display order value 【发布时间】:2020-12-24 00:35:25 【问题描述】:

我有一个产品表、类别表和映射表。类别另存为类别树。如果单个产品已映射到第三级层次结构中的最后一个类别。映射表中保存的所有级别具有相同的产品ID。

例如:假设有这样的类别 tre 电子>笔记本电脑>戴尔,当产品 id = 1 分配给类别“戴尔”时,映射将保存为 [1,Electronic],[1,LapTops],[1,DELL]

当我通过选择查询获取数据时,所有类别级别都会显示相同的产品 ID。

我的问题是我需要以 [productId, ProductName, LastCategortLevel, CategoryName, CategoryId] 检索数据。

请参考下面的实际结果。我只需要选择具有最后一个类别级别的突出显示的产品,即最高类别订单级别。

我不能使用另一个存储过程或函数,因为它只是大型存储过程的一小部分。

实际的数据库表非常大。但我试图用小型临时表实现相同的场景。请参阅以下查询。

DECLARE @Products TABLE (ProductId INT NOT NULL)

INSERT INTO @Products(ProductId)  
    SELECT ProductId 
    FROM (VALUES (1), (2), (3), (4)) as x (ProductId)

DECLARE @Categories TABLE (CategoId INT NOT NULL,
                           Name VARCHAR(MAX) NOT NULL,
                           ParentCategoryId INT NOT NULL,
                           DisplayOrder INT NOT NULL)

-- 1st category tree
INSERT INTO @Categories VALUES (10, 'Electronic', 0, 1)
INSERT INTO @Categories VALUES (11, 'LapTops', 10, 2)
INSERT INTO @Categories VALUES (12, 'DELL', 11, 3)
INSERT INTO @Categories VALUES (13, 'HP', 11, 3)

-- 2st category tree
INSERT INTO @Categories VALUES (14, 'Clothes', 0, 1)
INSERT INTO @Categories VALUES (15, 'T-Shirts', 14, 2)
INSERT INTO @Categories VALUES (16, 'Red', 15, 3)
INSERT INTO @Categories VALUES (17, 'Denim', 14, 2)
INSERT INTO @Categories VALUES (18, 'Levise', 17, 3)

DECLARE @Product_Category_Mappings TABLE(MappingId INT NOT NULL,
                                         ProductId INT NOT NULL,
                                         CategoryId INT NOT NULL)

INSERT INTO @Product_Category_Mappings VALUES (100, 1, 10)
INSERT INTO @Product_Category_Mappings VALUES (101, 1, 11)
INSERT INTO @Product_Category_Mappings VALUES (102, 1, 12)

INSERT INTO @Product_Category_Mappings VALUES (103, 2, 10)
INSERT INTO @Product_Category_Mappings VALUES (104, 2, 11)
INSERT INTO @Product_Category_Mappings VALUES (105, 2, 12)

INSERT INTO @Product_Category_Mappings VALUES (106, 3, 14)
INSERT INTO @Product_Category_Mappings VALUES (107, 3, 15)
INSERT INTO @Product_Category_Mappings VALUES (108, 3, 16)

INSERT INTO @Product_Category_Mappings VALUES (109, 4, 14)
INSERT INTO @Product_Category_Mappings VALUES (110, 4, 17)
INSERT INTO @Product_Category_Mappings VALUES (111, 4, 18)

SELECT * 
FROM @Products  P
INNER JOIN @Product_Category_Mappings M ON M.ProductId = P.ProductId
INNER JOIN @Categories C ON C.CategoId = M.CategoryId
WHERE M.ProductId = P.ProductId 
ORDER BY P.ProductId, C.DisplayOrder

上述脚本的结果。如何获得突出显示的行?

【问题讨论】:

【参考方案1】:

对于每个ProductId,您需要DisplayOrder 最高的行。您可以使用窗口函数:

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY P.ProductId ORDER BY C.DisplayOrder DESC) rn
    FROM @Products  P
    INNER JOIN @Product_Category_Mappings M ON M.ProductId = P.ProductId
    INNER JOIN @Categories C ON C.CategoId = M.CategoryId
    WHERE M.ProductId = P.ProductId 
) t
WHERE rn = 1
ORDER BY P.ProductId, C.DisplayOrder

【讨论】:

谢谢。我做了一些属性更改。因为显示了重复的 ProductId 错误,并且在那个小修复之后它起作用了。我已经用正确的查询编辑了您的答案以供将来参考。

以上是关于SQL Server:SELECT 查询以获取 DISTINCT 和 MAX 显示顺序值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 2014 中的 Select 查询中将数据分配给用户定义的表类型

我的 R 代码没有从 SQL Server 获取数据

如何避免两次编写 SQL Server 查询以避免重复?

转置查询创建节点 (SQL Server 2008)

SQL server查看查询所用时间

怎么修改SQL SERVER2008的select产生的临时结果存放的位置?每次查询行数较多的结果都会把C盘占满。