问题描述
我想加入两个表hierarchy
和item
:
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;