簡體   English   中英

Select 從另一個表查詢

[英]Select query from another table

我有兩張桌子:

CREATE TABLE store_category (
    store_id    int  NOT NULL PRIMARY KEY,
    category_id char NOT NULL
)

CREATE TABLE category (
    category_id char NOT NULL PRIMARY KEY,
    parent_id   char     NULL,
    name        char NOT NULL
)
store_id 類別ID
1 1a
2 2b
3 3c

category表:該表有3個級別的類別。 最高級別的類別在parent_id中有NULL

類別ID parent_id 姓名
1a NULL 一個
2b 1a b
3c 2b c

我想獲取商店類別的所有相關類別名稱。

預期查詢結果:

store_id 類別ID lv1 lv2 lv3
1 1a 一個 b c
2 2b 一個 b c
3 3c 一個 b c

我有一個想法,我將與category表中每個category_id相關的所有類別名稱放入臨時表中,然后將臨時表與store_category表連接起來。 我想知道這是否是個好主意。

我有一個想法,我將與類別表中每個category_id相關的所有類別名稱放入臨時表中,然后join臨時表與store_category表連接起來。 我想知道這是否是個好主意。

一個好主意——除了你不需要臨時表——也不需要循環。 您只需要一個遞歸(自引用)CTE。 CTE 是 select 數據層次結構和其他圖形結構的方式。

但是,我認為將PIVOT (或更具體地說, UNPIVOT )您的數據放入lv1lv2lv3列中不是一個好主意-我知道您的業務規則說只有 3 個深度級別,但是您的數據-模型確實允許超過 3 級深度(除非您有一個帶有UDFCHECK CONSTRAINT使用相同樣式的 CTE 查詢來限制最大depth )。 當您的數據維度隨查詢而變化(例如這個)時,您應該將它們作為行返回,然后將它們格式化以在應用程序代碼中顯示給最終用戶。 不是直接在 SQL 中。

至於分層查詢:請閱讀: CTE Recursion to get tree hierarchy

像這樣的東西:

DECLARE @getThisCategoryId char(2) = '3c';

WITH my_cte AS (
    
    SELECT
        c.category_id,
        c.parent_id,
        c.name,
        1 AS depth
    FROM
        category AS c
    WHERE
        c.category_id = @getThisCategoryId 

    UNION ALL
    
    SELECT
        other_categories.category_id,
        other_categories.parent_id,
        other_categories.name,
        collected_so_far.depth + 1 AS depth
    FROM
        category AS other_categories
        INNER JOIN my_cte AS collected_so_far ON
            other_categories.category_id = collected_so_far.parent_id    
)
SELECT
    *
FROM
    my_cte
    INNER JOIN store_category AS sc ON my_cte = category_id
ORDER BY
    sc.store_id

暫無
暫無

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

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