[英]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
)您的數據放入lv1
、 lv2
和lv3
列中不是一個好主意-我知道您的業務規則說只有 3 個深度級別,但是您的數據-模型確實允許超過 3 級深度(除非您有一個帶有UDF
的CHECK 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.