如何多次加入同一个表?

jas*_*e81 14 postgresql join

我有两个表,“hierarchy_table”和“name_table”。

层次结构表包含一个具有多个父级和子级的对象。每个父级和子级都由 id 引用。

|  object_id  |  parent_id_1  |  parent_id_2  |  child_id_1  |  child_id_2  |
-----------------------------------------------------------------------------
|     1234    |      9999     |      9567     |     5555     |     5556     |
-----------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

hierarchy_table 中的每个对象 id 在 name_table 中都有一个条目:

|  name_id  |    name    |
--------------------------
|   1234    |   ABCD     |
--------------------------
|   9999    |   ZYXW     |
--------------------------
| ...
Run Code Online (Sandbox Code Playgroud)

如何将hierarchy_table 中的每个id 多次加入name_table,以便我可以得到填充每个名称的结果?

像这样:

|   object    |   parent_1    |   parent_2    |   child_1    |   child_2    |
-----------------------------------------------------------------------------
|     ABCD    |      ZYXW     |      BBBB     |     CCCC     |     DDDD     |
-----------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

注意:示例中的表名只是为了清晰/简单起见,真实名称具有专有名称。

ype*_*eᵀᴹ 14

hierarchy_table所有参考的有5列name_table,所以你需要5联接。最好使用LEFT连接而不是INNER,以防其中一些列可以为空并且您仍然希望返回行:

SELECT 
    o.name  AS object, 
    p1.name AS parent_1, 
    p2.name AS parent_2, 
    c1.name AS child_1,  
    c2.name AS child_2 
FROM 
    hierarchy_table AS h
  LEFT JOIN name_table AS o   ON h.object_id   = o.name_id
  LEFT JOIN name_table AS p1  ON h.parent_id_1 = p1.name_id  
  LEFT JOIN name_table AS p2  ON h.parent_id_2 = p2.name_id
  LEFT JOIN name_table AS c1  ON h.child_id_1  = c1.name_id 
  LEFT JOIN name_table AS c2  ON h.child_id_2  = c2.name_id ;
Run Code Online (Sandbox Code Playgroud)