如何在 SQL 中加入 table 和 Grandparent-Parent-Child 列?
How to join a table with Grandparent-Parent-Child columns in SQL?
我有两个表 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;
我有两个表 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;