[英]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.