繁体   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