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


9

「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     |
-----------------------------------------------------------------------------

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

回答:


11

hierarchy_tableは、すべてがを参照する5つの列があるname_tableため、5つの結合が必要です。これらの列の一部がnull可能であり、行を返す必要がある場合LEFTINNER、ではなく結合を使用することをお勧めします。

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 ;

はい、そのため、列はNULL可能ですので、左結合が必要です。ありがとうございました。
jase81

どういうわけか、私はこの答えが出るまでエイリアシングを理解していませんでした。これは、MS Access(おそらく他のもの)では機能しないことに注意してください。私は非常に似たようなことをしようとしていて、構文エラーが出続けました。アクセスには、()による結合のネストが必要です。
doubleJ

@doubleJはい、Accessは、に複数の結合がある場合は常に、このように括弧を追加する必要があることで悪名高くなっていFROMます。
ypercubeᵀᴹ

3

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

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

2
古いスタイル(20年以上という意味)の結合は使用しない方がよいでしょう。ANSI構文は、より読みやすく、エラーが発生しにくくなっています。
dezso

0

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

合理的な:

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

方法:

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 ;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.