it-swarm.com.de

Wie kann ich mehrmals an derselben Tabelle teilnehmen?

Ich habe zwei Tabellen, "hierarchy_table" und "name_table".

Die Hierarchietabelle enthält ein Objekt mit mehreren Eltern und Kindern. Jedes Elternteil und Kind wird mit der ID referenziert.

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

Jede Objekt-ID in der hierarchy_table hat einen Eintrag in der name_table:

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

Wie verbinde ich jede ID in der hierarchy_table mehrmals mit der name_table, damit ich ein Ergebnis erzielen kann, bei dem jeder Name ausgefüllt ist?

So was:

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

Hinweis: Die Tabellennamen im Beispiel dienen lediglich der Übersichtlichkeit. Die tatsächlichen Namen haben Eigennamen.

9
jase81

Der hierarchy_table Hat 5 Spalten, die alle auf den name_table Verweisen, sodass Sie 5 Joins benötigen. Es ist möglicherweise besser, LEFT Joins anstelle von INNER zu verwenden, falls einige dieser Spalten nullwertfähig sind und Sie dennoch möchten, dass die Zeilen zurückgegeben werden:

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ᵀᴹ

Sie können den Aliasnamen für Tabellen verwenden, die an der Abfrage beteiligt sind.

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 : Alias ​​sollte verwendet werden, wenn Sie mehrmals derselben Tabelle beitreten möchten

Rational :

In Postgres verbinden normalerweise Personen eine Spalte in einer Tabelle mit einer anderen Spalte in einer anderen Tabelle. Dies war aus gestalterischer Sicht als normaler Anwendungsfall brillant. Wenn Sie zusätzliche Spalten verknüpfen möchten, müssen Sie Aliase verwenden (Best Practice).

HOWTO :

Stellen Sie beim Ausführen eines INNER JOIN sicher, dass Sie eine AS-Klausel zusammen mit dem Namen hinzufügen.

Beispiel

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

Wenn Sie die 'akzeptierte' Antwort bemerken, tun Sie dies oben.

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