如何解决SQL Server:SELECT查询以获取DISTINCT和MAX显示顺序值
我有一个产品表,类别表和映射表。类别另存为类别树。如果单个产品已映射到第三级层次结构中的最后一个类别。使用相同的产品ID保存在映射表中的所有级别。
例如:假设有一个类别tre,例如Electronic> LapTops> DELL,并且当产品ID = 1分配给类别“ DELL”时,映射将另存为[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',1)
INSERT INTO @Categories VALUES (11,'LapTops',10,2)
INSERT INTO @Categories VALUES (12,'DELL',11,3)
INSERT INTO @Categories VALUES (13,'HP',3)
-- 2st category tree
INSERT INTO @Categories VALUES (14,'Clothes',1)
INSERT INTO @Categories VALUES (15,'T-Shirts',14,2)
INSERT INTO @Categories VALUES (16,'Red',15,3)
INSERT INTO @Categories VALUES (17,'Denim',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,11)
INSERT INTO @Product_Category_Mappings VALUES (102,12)
INSERT INTO @Product_Category_Mappings VALUES (103,2,10)
INSERT INTO @Product_Category_Mappings VALUES (104,11)
INSERT INTO @Product_Category_Mappings VALUES (105,12)
INSERT INTO @Product_Category_Mappings VALUES (106,3,14)
INSERT INTO @Product_Category_Mappings VALUES (107,15)
INSERT INTO @Product_Category_Mappings VALUES (108,16)
INSERT INTO @Product_Category_Mappings VALUES (109,4,14)
INSERT INTO @Product_Category_Mappings VALUES (110,17)
INSERT INTO @Product_Category_Mappings VALUES (111,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
以上脚本的结果。如何获得突出显示的行?
解决方法
对于每个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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。