J'ai une table de produits, une table de catégories et une table de mappage. Catégorie enregistrée sous forme d'arborescence de catégories. Si un seul produit a été mappé avec la dernière catégorie dans une hiérarchie de niveau trois. Tous les niveaux enregistrés dans la table de mappage avec le même identifiant de produit.

Par exemple : supposons qu'il existe une catégorie comme celle-ci Électronique> Ordinateurs portables> DELL et lorsque l'ID de produit = 1 affecté à la catégorie « DELL » le mappage sera enregistré sous [1,Électronique],[1,LapTops],[1,DELL]

Lorsque j'obtiens des données avec une requête de sélection, tous les niveaux de catégorie apparaissent avec le même identifiant de produit.

Mon problème est que je dois récupérer des données en tant que [productId, ProductName, LastCategortLevel, CategoryName, CategoryId].

Reportez-vous au résultat réel ci-dessous. J'ai juste besoin de choisir le produit en surbrillance avec le dernier niveau de catégorie qui est le niveau de commande de catégorie le plus élevé.

enter image description here

Je ne peux pas utiliser une autre procédure stockée ou fonction car il s'agit d'une petite partie d'une grande procédure stockée.

Les tables de base de données réelles sont très volumineuses. Mais j'ai essayé d'implémenter le même scénario avec de petites tables temporaires. voir les requêtes ci-dessous.

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

Résultat du script ci-dessus. Comment obtenir des lignes en surbrillance ?

enter image description here

2
Isanka Thalagala 4 sept. 2020 à 21:16

1 réponse

Meilleure réponse

Pour chaque ProductId, vous voulez la ligne avec le plus grand DisplayOrder. Vous pouvez utiliser les fonctions de fenêtre :

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
1
GMB 4 sept. 2020 à 18:29