如何在SQL中使用Grandparent-Parent-Child列联接表?

问题描述

我想加入两个表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     |
|-----------|-------------|-------------|

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

解决方法

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

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

,

您可以使用联接:

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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...