Wie kann ich mehrmals an derselben Tabelle teilnehmen?

9

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.

jase81
quelle

Antworten:

11

Das hierarchy_tablehat 5 Spalten, die alle auf das verweisen name_table, so dass Sie 5 Joins benötigen. Es ist möglicherweise besser, LEFTVerknüpfungen anstelle von zu verwenden INNER, 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 ;
ypercubeᵀᴹ
quelle
Ja, Spalten sind also nullwertfähig, daher benötige ich den linken Join. Vielen Dank.
jase81
Aus irgendeinem Grund bekam ich bis zu dieser Antwort kein Verständnis für Aliasing. Es kann erwähnenswert sein, dass dies in MS Access (möglicherweise in anderen) nicht funktioniert. Ich habe versucht, etwas sehr Ähnliches zu tun, und es wurde immer wieder ein Syntaxfehler angezeigt. Für den Zugriff müssen Joins mit () verschachtelt werden.
doubleJ
@doubleJ Ja, Access ist bekannt dafür, dass zusätzliche Klammern erforderlich sind, wenn mehr als 1 Joins vorhanden sind FROM.
Ypercubeᵀᴹ
3

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
Isaac A. Nugroho
quelle
2
Verwenden Sie besser nicht die alten Verknüpfungen (alt bedeutet mehr als 20 Jahre). Die ANSI-Syntax ist besser lesbar und weniger fehleranfällig.
Dekso
0

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).

WIE MAN:

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