SQL 服务器:SELECT 查询获取 DISTINCT 和 MAX 显示顺序值
SQL Server : SELECT query to get DISTINCT and MAX display order value
我有一个产品 table、类别 table 和映射 table。类别保存为类别树。如果单个产品已映射到三级层次结构中的最后一个类别。映射中保存的所有级别 table 具有相同的产品 ID。
例如:假设有这样的类别 tre Electronic>LapTops>DELL 并且当产品 id = 1 分配给类别 'DELL' 映射将保存为 [1,Electronic],[1,LapTops],[ 1,戴尔]
当我通过 select 查询获取数据时,所有类别级别都显示为相同的产品 ID。
我的问题是我需要将数据检索为 [productId、ProductName、LastCategortLevel、CategoryName、CategoryId]。
参考下面的实际结果。我只需要选择最后一个类别级别的突出显示的产品,即最高类别订单级别。
我不能使用其他存储过程或函数,因为它只是大型存储过程的一小部分。
实际数据库table非常大。但我试图用小温度 tables 实现相同的场景。请参阅以下查询。
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
上述脚本的结果。我如何获得突出显示的行?
对于每个 ProductId
,您需要具有最高 DisplayOrder
的行。您可以使用 window 函数:
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
我有一个产品 table、类别 table 和映射 table。类别保存为类别树。如果单个产品已映射到三级层次结构中的最后一个类别。映射中保存的所有级别 table 具有相同的产品 ID。
例如:假设有这样的类别 tre Electronic>LapTops>DELL 并且当产品 id = 1 分配给类别 'DELL' 映射将保存为 [1,Electronic],[1,LapTops],[ 1,戴尔]
当我通过 select 查询获取数据时,所有类别级别都显示为相同的产品 ID。
我的问题是我需要将数据检索为 [productId、ProductName、LastCategortLevel、CategoryName、CategoryId]。
参考下面的实际结果。我只需要选择最后一个类别级别的突出显示的产品,即最高类别订单级别。
我不能使用其他存储过程或函数,因为它只是大型存储过程的一小部分。
实际数据库table非常大。但我试图用小温度 tables 实现相同的场景。请参阅以下查询。
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
上述脚本的结果。我如何获得突出显示的行?
对于每个 ProductId
,您需要具有最高 DisplayOrder
的行。您可以使用 window 函数:
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