製品テーブル、カテゴリ テーブル、マッピング テーブルがあります。カテゴリはカテゴリ ツリーとして保存されます。単一の製品がレベル 3 の階層の最後のカテゴリにマップされている場合。同じプロダクト ID を持つマッピング テーブルに保存されたすべてのレベル。
例: 「Electronic>LapTops>DELL」のようなカテゴリ tre があり、製品 ID = 1 がカテゴリ「DELL」に割り当てられている場合、マッピングは [1,Electronic],[1,LapTops],[1,DELL] として保存されます。
選択クエリでデータを取得すると、すべてのカテゴリ レベルが同じ製品 ID で表示されます。
私の問題は、データを [productId、ProductName、LastCategortLevel、CategoryName、CategoryId] として取得する必要があることです。
以下の実際の結果を参照してください。最後のカテゴリレベルが「hi」である強調表示された製品を選択するだけです。ゲスト カテゴリの順序レベル。
別のストアド プロシージャまたは関数は、大規模なストアド プロシージャの一部であるため、使用できません。
実際のデータベース テーブルは非常に大きくなります。しかし、私は小さな一時テーブルを使用して同じシナリオを実装しようとしました。以下のクエリを参照してください。
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 が最も高い行が必要です。ウィンドウ関数を使用できます。
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
ありがとうございます。属性変更をいくつか行いました。 ProductId の重複エラーが表示され、その小さな修正後に機能したためです。今後の参考のために、正しいクエリを使用して回答を編集しました。
– イサンカ タラガラ
2020 年 9 月 4 日 19:12