製品、カテゴリ、およびカテゴリ内の製品のテーブルを使用したかなり標準的なセットアップですが、製品のいくつかの上位カテゴリを取得するためのより良い/より効果的な方法があるかどうか疑問に思っていました (それらを個別に戻したくありません)内部結合は実行できません)。
私が現在持っているSQLは次のとおりです。
SELECT p.*,
(SELECT TOP 1 category_name FROM categories c INNER JOIN products_and_categories pc ON pc.category_id = c.category_id WHERE p.product_id = pc.product_id AND category_parent = 100 ORDER BY sort) AS cat_1,
(SELECT TOP 1 category_name FROM categories c INNER JOIN products_and_categories pc ON pc.category_id = c.category_id WHERE p.product_id = pc.product_id AND category_parent = 200 ORDER BY sort) AS cat_2,
(SELECT TOP 1 category_name FROM categories c INNER JOIN products_and_categories pc ON pc.category_id = c.category_id WHERE p.product_id = pc.product_id AND category_parent = 500 ORDER BY sort) AS cat_3,
(SELECT TOP 1 category_name FROM (SELECT TOP 2 c.* FROM categories c INNER JOIN products_and_categories pc ON pc.category_id = c.category_id WHERE p.product_id = pc.product_id AND category_parent = 500 ORDER BY sort) c1 ORDER BY sort DESC) AS cat_4,
(SELECT TOP 1 category_name FROM categories c INNER JOIN products_and_categories pc ON pc.category_id = c.category_id WHERE p.product_id = pc.product_id AND category_parent = 50 ORDER BY sort) AS cat_5,
(SELECT TOP 1 category_name FROM (SELECT TOP 2 c.* FROM categories c INNER JOIN products_and_categories pc ON pc.category_id = c.category_id WHERE p.product_id = pc.product_id AND category_parent = 50 ORDER BY sort) c1 ORDER BY sort DESC) AS cat_6
FROM products AS p
いくつかのコラムでこの方法で十分満足していますが、他に方法がないか疑問に思っていましたか? PIVOTテーブルまたは私が考えていなかった何かに参加するか、この方法でそれを受け入れる必要があるかのいずれかです。
他にもいくつかの制限があります (重要な場合とそうでない場合があります)。
- 一部のサブクエリは結果を返さない場合があります
- 上位 2 つのカテゴリが必要な行の一部 (上記のコードでわかるように)