SQL Server: DISTINCT および MAX の表示順序値を取得する SELECT クエリ

okwaves2024-01-25  8

製品テーブル、カテゴリ テーブル、マッピング テーブルがあります。カテゴリはカテゴリ ツリーとして保存されます。単一の製品がレベル 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

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。