如何在 SQL 中加入包含祖父-父-子列的表?

Posted

技术标签:

【中文标题】如何在 SQL 中加入包含祖父-父-子列的表?【英文标题】:How to join a table with Grandparent-Parent-Child columns in SQL? 【发布时间】:2020-09-02 10:05:50 【问题描述】:

我有两张表 hierarchyitem 我想加入:

hierarchy
|------------------|------------------|-------------|--------------|------------|--------------|
|  grandparent_id  | grandparent_name |  parent_id  | parent_name  |  child_id  |  child_name  |
|------------------|------------------|-------------|--------------|------------|--------------|
|        100       |       Make       |     101     |     Model    |     102    |      CPU     |
|------------------|------------------|-------------|--------------|------------|--------------|

item
|-----------|-------------|
|  item_id  |  item_name  |
|-----------|-------------|
|    100    |     Dell    |
|    101    |     XPS     |
|    102    |   i5-9300H  |
|-----------|-------------|

想要的输出:

|-----------|-------------|-------------|
|  item_id  |  item_name  |  hierarchy  |
|-----------|-------------|-------------|
|    100    |     Dell    |     Make    |
|    101    |     XPS     |     Model   |
|    102    |   i5-9300H  |     CPU     |
|-----------|-------------|-------------|

执行此查询的最有效方法是什么?

【问题讨论】:

使用 UNION 取消嵌套源表。 How to create a mysql hierarchical recursive query 【参考方案1】:

您可以取消透视层次结构的列,然后加入:

select i.item_id, i.item_name, h.model
from item i
inner join (
    select grand_parent_id item_id, grand_parent_name model from hierarchy
    union all select parent_id, parent_name from hierarchy
    union all select child_id, child_name from hierarchy
) h on h.item_id = i.item_id

如果层次结构中可能缺少项目,那么您可以使用left join 而不是inner join

【讨论】:

【参考方案2】:

您可以使用连接:

select i.*, coalesce(h1.grand_parent_name, h2.parent_name, h3.child_name) as hierarchy
from items i left join
     hierarchy h1
     on h1.grand_parent_id = i.item_id left join
     hierarchy h2
     on h2.parent_id = i.item_id left join
     hierarchy h3
     on h3.child_id = i.item_id;

【讨论】:

以上是关于如何在 SQL 中加入包含祖父-父-子列的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中加入六个表,同时只包含某些行?

我想在大查询中加入两个具有公共列的表?

如何在oracle中使用嵌套游标遍历同一张表[关闭]

如何使用本机 SQL 在 Hibernate 中获取仅包含选定列的表实体列表?

如何在JAVA中加入没有重复列的Spark数据框

如何在JAVA中加入没有重复列的Spark数据框