簡體   English   中英

進行多個子選擇的更好方法?

[英]Better way of doing multiple sub-selects?

使用產品,類別和類別中的產品表的標准設置,但是我想知道是否有更好/更有效的方法來獲取產品的幾個頂級類別(我真的不希望將它們分開行,因此內部聯接不可行)。

我目前擁有的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個類別(如上面的代碼所示)

由於您的相關子查詢只有簡單的等式條件,因此可以將其移至聯接,然后可以使用ROW_NUMBER()而不是使用TOP 1來對類別進行排序,然后僅為每個product_ID / Parent_category組合選擇前1個,或者在如果您有兩個字段,請選擇第二個類別。

我認為這對您有用:

WITH ProductCategories AS
(   SELECT  pc.Product_ID,
            c.category_name,
            category_parent,
            RowNum = ROW_NUMBER() OVER(PARTITION BY pc.Product_ID, category_parent ORDER BY Sort)
    FROM    categories c 
            INNER JOIN products_and_categories pc 
                ON pc.category_id = c.category_id   
), MaxProductCategories AS
(   SELECT  Product_ID,
            [Cat_1] = MAX(CASE WHEN RowNum = 1 AND category_parent = 100 THEN category_name END),
            [Cat_2] = MAX(CASE WHEN RowNum = 1 AND category_parent = 200 THEN category_name END),
            [Cat_3] = MAX(CASE WHEN RowNum = 1 AND category_parent = 500 THEN category_name END),
            [Cat_4] = MAX(CASE WHEN RowNum = 2 AND category_parent = 500 THEN category_name END),
            [Cat_5] = MAX(CASE WHEN RowNum = 1 AND category_parent = 50 THEN category_name END),
            [Cat_6] = MAX(CASE WHEN RowNum = 2 AND category_parent = 50 THEN category_name END)
    FROM    ProductCategories
    WHERE   RowNum IN (1, 2)
    AND     category_parent IN (50, 100, 200, 500)
    GROUP BY Product_ID
)
SELECT  p.*,
        mpc.Cat_1,
        mpc.Cat_2,
        mpc.Cat_3,
        mpc.Cat_4,
        mpc.Cat_5,
        mpc.Cat_6
FROM    products p
        LEFT JOIN MaxProductCategories mpc
            ON mpc.Product_ID = p.Product_ID;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM