Newbie-Frage zu einer Abfrage

Hallo,

ich habe folgendes Problem, welches meinen derzeitigen Wissensstand um eine Wolkenkratzerhöhe überragt:

Eine DB mit drei Tabellen.

Tabelle 1 mit den Feldern ‘id’, ‘X’, ‘Y’, ‘Z’. Alle Felder sind INTEGER, das Feld ‘id’ ist SERIAL.

Tabelle 2 mit den Feldern ‘id’, ‘X_name’, ‘X_attr1’, ‘X_attr2’. ‘id’ ist auch hier SERIAL, die anderen drei Felder sind TEXT.

Tabelle 3 ählich wie Tabelle 2, nur alles auf Y bezogen, also ‘id’, ‘Y_name’, ‘Y_attr1’, ‘Y_attr2’.

Die Werte in den Feldern ‘X’ und ‘Y’ von Tabelle 1 entsprechen jeweils den Feldern ‘id’ in den Tabellen 2 und 3. Die Werte in Feld ‘Z’ sind frei vergeben.

Ich möchte jetzt eine Abfrage erstellen, die mir alles aus Tabelle ausgibt, wenn Feld ‘Z’ einen bestimmten Wert hat. Dabei sollen aber die Integerwerte in den Feldern ‘X’ und ‘Y’ durch die entsprechenden Werte aus den Feldern ‘X_name’ und ‘Y_name’ aus Tabelle 2 und 3 ersetzt werden.

Und als Erweiterung dieser Abfrage soll es noch möglich sein, auch noch die Werte aus den übrigen Feldern von Tabelle 2 und 3 anzuzeigen. Kann mir da jemand auf die Sprünge helfen?

Danke, jennix

Dafür gibt es WHERE

Dabei sollen aber die Integerwerte in den Feldern ‘X’ und ‘Y’ durch die entsprechenden Werte aus den Feldern ‘X_name’ und ‘Y_name’ aus Tabelle 2 und 3 ersetzt werden.

Dafür gibt es JOIN

Und als Erweiterung dieser Abfrage soll es noch möglich sein, auch noch die Werte aus den übrigen Feldern von Tabelle 2 und 3 anzuzeigen. Kann mir da jemand auf die Sprünge helfen?

Dafür gibt es die SELECT-Liste.

Danke, jennix

Okay, eine kleine Fingerübung vorm ersten Kaffee:

test=*# select * from t1;
 id | x | y | z
----+---+---+---
  1 | 2 | 3 | 5
(1 row)

test=*# select * from t2;
 id | x_name | x_attr1 | x_attr2
----+--------+---------+---------
  2 | xname  | xattr1  | xattr2
(1 row)

test=*# select * from t3;
 id | y_name | y_attr1 | y_attr2
----+--------+---------+---------
  3 | yname  | yattr1  | yattr2
(1 row)

test=*# select a.x, a.y, a.z, b.X_name, b.x_attr1, c.y_name, c.y_attr1 from t1 a left join t2 b on (a.x=b.id) left join t3 c on (a.y=c.id) where a.z=5;
 x | y | z | x_name | x_attr1 | y_name | y_attr1
---+---+---+--------+---------+--------+---------
 2 | 3 | 5 | xname  | xattr1  | yname  | yattr1
(1 row)

test=*# select a.x, a.y, a.z, b.X_name, b.x_attr1, c.y_name, c.y_attr1 from t1 a left join t2 b on (a.x=b.id) left join t3 c on (a.y=c.id) where a.z=1;
 x | y | z | x_name | x_attr1 | y_name | y_attr1
---+---+---+--------+---------+--------+---------
(0 rows)

Andreas

Vielen Dank. Wie macht man sowas noch vor dem Kaffee? Ich musste da ganz vorsichtig rangehen, denn als ich das gestern selber versucht habe, hat sich nach dem zweiten JOIN immer mein Hirn abgeschaltet und ich bin eine halbe Stunde später mit Tastaturabdrücken im Gesicht und vollgesabbertem Mauspad wieder aufgewacht :smiley:

Aber damit habt ihr Euch jetzt Euer eigenes Grab geschaufelt, denn jetzt werden wohl noch mehr Fragen von mir kommen :wink:

mfG, jennix