web-dev-qa-db-ja.com

同じテーブルに複数回参加する方法は?

「hierarchy_table」と「name_table」の2つのテーブルがあります。

階層テーブルには、複数の親と子を持つオブジェクトが含まれています。親と子はそれぞれIDで参照されます。

|  object_id  |  parent_id_1  |  parent_id_2  |  child_id_1  |  child_id_2  |
-----------------------------------------------------------------------------
|     1234    |      9999     |      9567     |     5555     |     5556     |
-----------------------------------------------------------------------------

Hierarchy_tableの各オブジェクトIDは、name_tableにエントリを持っています。

|  name_id  |    name    |
--------------------------
|   1234    |   ABCD     |
--------------------------
|   9999    |   ZYXW     |
--------------------------
| ...

Hierarchy_tableの各IDをname_tableに複数回結合して、すべての名前が入力された結果を得るにはどうすればよいですか?

このような:

|   object    |   parent_1    |   parent_2    |   child_1    |   child_2    |
-----------------------------------------------------------------------------
|     ABCD    |      ZYXW     |      BBBB     |     CCCC     |     DDDD     |
-----------------------------------------------------------------------------

注:例のテーブル名は、わかりやすく/簡単にするためのものであり、実際の名前は適切な名前になっています。

9
jase81

hierarchy_tableには、すべてname_tableを参照する5つの列があるため、5つの結合が必要です。これらの列の一部がnull可能で、行を返してほしい場合は、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 ;
11
ypercubeᵀᴹ

クエリに関係するテーブルにエイリアス名を使用できます。

select b.name object, c.name parent_1, d.name parent_2 
from hierarchy_table a, name_table b, name_table c, name_table d
where a.object_id = b.name_id 
  and a.parent_id_1 = c.name_id 
  and a.parent_id_2 = d.name_id
3

TL&DR:同じテーブルに複数回結合する場合は、エイリアスを使用する必要があります

合理的:

Postgresでは、通常、人々はあるテーブルのある列を別のテーブルの別の列に結合します。これは、通常の使用例と同様に、設計の観点から見事です。追加の列を結合する場合は、エイリアスを使用する必要があります(ベストプラクティス)。

HOWTO:

INNER JOINを実行するときは、名前とともにAS句を必ず追加してください。

INNER JOIN ipaddresses as child_address ON ipaddress_relations.ipaddress_id = child_address.ipaddressid

「受け入れられた」答えに気付いた場合、これは上記のことを行います。

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 ;
0
FlyingV