「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 |
-----------------------------------------------------------------------------
注:例のテーブル名は、わかりやすく/簡単にするためのものであり、実際の名前は適切な名前になっています。
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 ;
クエリに関係するテーブルにエイリアス名を使用できます。
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
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 ;