Bagaimana cara bergabung ke tabel yang sama beberapa kali?

9

Saya memiliki dua tabel, "hierarki_table" dan "name_table".

Tabel hierarki berisi objek yang memiliki banyak orang tua dan anak-anak. Setiap orang tua dan anak dirujuk oleh id.

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

Setiap id objek dalam hierarki_table memiliki entri dalam name_table:

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

Bagaimana cara bergabung dengan setiap id di hierarki_table ke name_table beberapa kali sehingga saya dapat memperoleh hasil di mana setiap nama diisi?

Seperti ini:

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

Catatan: nama tabel dalam contoh hanya untuk kejelasan / kesederhanaan, nama asli memiliki nama yang tepat.

jase81
sumber

Jawaban:

11

The hierarchy_tablememiliki 5 kolom bahwa semua referensi name_table, sehingga Anda perlu 5 bergabung. Mungkin lebih baik menggunakan LEFTgabungan daripada INNER, seandainya beberapa kolom ini dapat dibatalkan dan Anda masih ingin baris dikembalikan:

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 ;
ypercubeᵀᴹ
sumber
Ya, jadi kolom dapat dibatalkan, jadi saya perlu bergabung kiri. Terima kasih.
jase81
Untuk beberapa alasan, saya hanya tidak mengerti tentang aliasing sampai jawaban ini. Mungkin perlu dicatat bahwa ini tidak akan berfungsi di MS Access (mungkin orang lain). Saya mencoba melakukan sesuatu yang sangat mirip dan saya terus mendapatkan kesalahan sintaksis. Akses membutuhkan nesting of Joins with ().
doubleJ
@doubleJ ya, Akses terkenal karena kebutuhan ini tanda kurung tambahan setiap kali ada lebih dari 1 bergabung di FROM.
ypercubeᵀᴹ
3

Anda bisa menggunakan nama alias untuk tabel yang terlibat dalam kueri.

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
Isaac A. Nugroho
sumber
2
Anda sebaiknya tidak menggunakan gaya lama (cara lama lebih dari 20 tahun) bergabung. Sintaks ANSI lebih mudah dibaca dan lebih rentan kesalahan.
dezso
0

TL&DR: Alias ​​harus digunakan ketika Anda ingin bergabung ke tabel yang sama beberapa kali

Rasional:

Di Postgres, biasanya orang bergabung dengan satu kolom dalam satu tabel ke kolom lain di tabel yang berbeda. Ini brilian dari perspektif desain sebagai kasus penggunaan normal. Saat Anda ingin bergabung dengan kolom tambahan, Anda harus menggunakan alias (praktik terbaik).

HOWTO:

Saat melakukan INNER JOIN, pastikan untuk menambahkan klausa AS bersama dengan namanya.

Contoh

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

Jika Anda memperhatikan jawaban 'diterima' lakukan ini di atas.

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