SQL JOIN Anfrage

Hi,
ich bin relativ neu in Sachen Datenbanken!
Ich habe eine DB, die mehrere Tabellen und diese sind alle gleich aufgebaut, d.h. die Values sind gleich:
TaskCommonDim|TaskResource|TaskStart|TaskEnd|Piority
Die Anzahl ist abhängig von meinem Java Programm, das dem User, durch einem Wizard die Möglichkeit gibt eine neue Tabelle zu erstellen. Danach kann dieser ein oder mehrere Tabellen aussuchen und dies werden in einem JTable angezeigt. Die namen der Tabellen werden in einem Vector gespeichert. (Programmdetails, bla!)
Die TaskCommonDim ist in jeder Tabelle gleich!
Meine SQL Abfrage soll nun von den ausgewählten Tabellen folgendes anzeigen:
TaskCommonDim|TaskStart|TaskEnd
Ich weiß nicht wie ich solch eine Anfrage machen kann! Ich bin sehr verzweifelt!

queries sehen in weniger als 120% aller fälle in etwa so aus

[B]select [/B].... deine felder
[B]from [/B]TaskCommonDim [B]as [/B]dim
[[B]inner [/B]| [B]left [/B]| [B]right [/B]| ...] [B]join [/B]TaskStart [B]as [/B]tst [B]on [/B](stt.id_dim = dim.id_dim [B]and [/B].....)
[[B]inner [/B]| [B]left [/B]| [B]right [/B]| ...] [B]join [/B]TaskEnd [B]as [/B]ted [B]on [/B](ted.id_ted = ted.id_tst [B]and [/B].....)
[B]where [/B]....
[B]group by [/B]....
[B]order by [/B]...

in den allermeisten faellen reichen einfache join’s … einfach den modifier davor weglassen, oder inner hinschreiben

[LEFT]Hi,

hab fest gestellt das ich in meiner Frage das fasche wollte, als Ausgabe sollte eher soetwas rauskommen:

TaskCommonDim|Tabelle1         |Tabelle2         |...
IDbla1       |TaskEnd-TaskStart|TaskEnd-TaskStart|..
...          |...              |...              |...

-Zeile 1 soll der Header sein! TaskEnd-TaskStart würde ich eher über getdate berechnen, da beides vom Typ datime ist sollte nur exemplarisch sein!

Nur zum Hintergrund (alles in Java):
-Man erstellt über ein Wizard sogenannte “Module” und für jedes “Modul” gibt es eine Tabelle
-Den Namen der “Module” bzw. Tabellen kann man in dem Wizard selber erstellen
-man sucht sich für jedes “Modul” entsprechende Eintragungen einer anderen DB aus

  • als nächstes kann man für einen “Scenario” einen odere mehrere “Module” wählen
    -danach kann man ein “Scenario” starten

-> dies alles ist gegeben und soll nicht verändert werden - mag zwar komisch sein, dass die Tabellen gleich aufgebaut sind soll aber erstmal so sein

Ich habe die Namen der “Module” bzw. Tabellen eines “Scenario” in einer ini-Datei gespeichert und dann in einem Vector eingelesen.

Würde mich auch über Beispiele freuen! Oder kann man dies genauso machen?
[/LEFT]

Ich drücke mal kurz aus was gerade beim Lesen deines Beitrages durch meinen Kopf ging: Whöh?

Leider verstehe ich nicht ganz was eigentlich deine Frage ist.
Vielleicht hilft dir das weiter:

taramsis=# \d
         Liste der Relationen
 Schema | Name |   Typ   | Eigentümer 
--------+------+---------+------------
 public | tab1 | Tabelle | postgres
 public | tab2 | Tabelle | postgres
(2 Zeilen)

taramsis=# SELECT * FROM tab1;
 taskcommondim | taskresource |      taskstart      |          taskend           | priority 
---------------+--------------+---------------------+----------------------------+----------
             1 | Resource 1   | 2009-07-16 15:00:00 | 2009-07-16 19:26:17.85068  |        5
             2 | Resource 2   | 2009-07-16 12:00:00 | 2009-07-16 19:26:39.672631 |        5
             3 | Resource 3   | 2009-07-14 12:00:00 | 2009-07-14 16:12:00        |        5
(3 Zeilen)

taramsis=# SELECT * FROM tab2;
 taskcommondim | taskresource |      taskstart      |          taskend           | priority 
---------------+--------------+---------------------+----------------------------+----------
             1 | Resource 5   | 2009-07-12 11:00:00 | 2009-07-16 19:28:22.894786 |        5
             2 | Resource 6   | 2009-07-12 17:00:00 | 2009-07-15 01:19:00        |        5
             3 | Resource 7   | 2009-07-12 15:00:00 | 2009-07-13 03:34:00        |        5
(3 Zeilen)

taramsis=# SELECT t1.taskcommondim, (t1.taskend - t1.taskstart) AS dauer1, (t2.taskend - t2.taskstart) AS dauer2
taramsis-# FROM tab1 AS t1 JOIN tab2 AS t2 ON (t1.taskcommondim = t2.taskcommondim);
 taskcommondim |     dauer1      |         dauer2         
---------------+-----------------+------------------------
             1 | 04:26:17.85068  | 4 days 08:28:22.894786
             2 | 07:26:39.672631 | 2 days 08:19:00
             3 | 04:12:00        | 12:34:00
(3 Zeilen)

taramsis=#

Hi,
vielen Dank! Aber wie würde man die Anfrage bei mehr als zwei Tabellen stellen? Das schluckt er nicht:

SELECT t1.taskcommondim, (t1.taskend - t1.taskstart) AS dauer1, (t2.taskend - t2.taskstart) AS dauer2, (t3.taskend - t3.taskstart) AS dauer3
FROM tab1 AS t1 JOIN tab2 AS t2 JOIN tab3 AS t3 ON (t1.taskcommondim = t2.taskcommondim) AND (t1.taskcommondim = t3.taskcommondim) AND 

(t2.taskcommondim = t3.taskcommondim);

Ohne zu testen:

SELECT t1.taskcommondim, (t1.taskend - t1.taskstart) AS dauer1, (t2.taskend - t2.taskstart) AS dauer2, (t3.taskend - t3.taskstart) AS dauer3
FROM tab1 AS t1 
  JOIN tab2 AS t2 ON (t1.taskcommondim = t2.taskcommondim)
  JOIN tab3 AS t3 ON (t1.taskcommondim = t3.taskcommondim)

übrigends den Header würde ich selber in Java anzeigen, da dor nur:
taskCommonID | tab1 |tab2|… (immer der Tabellennamen)
stehen soll!

Den ‘Header’ hat psql extra für dich mit ausgegeben damit es einfacher zu lesen ist. Bei einer Abfrage kommen natürlich nur die Datensätze zurück.

a) Benutzt du eigentlich postrgesql als Datenbank?

b) du musst dir dringend SQL-Grundlagen aneignen

c) Ich werde das Gefühl nicht los, dass dein Konzept… falsch ist. Bitte erklär doch mal was genau du vor hast. Bitte nicht anhand von Relationen oder Feldern sondern anhand des Prozesses.
Was genau wilst du mit deiner Anwendung lösen?
Anwendungen mit flexiblen Tabellen sind nach meiner Erfahrung meist falsch entworfen.

zustimm So etwas benötigt man nur in sehr spezifischen Fällen.