Abfrage mehrere Tabellen

Guten Tag,

ich bin noch frisch in der sql-Welt und stehe gerade vor einem Problem, dass ich nicht lösen kann. Ich habe eine SQL-Datenbank (postgres) übernommen, die ich komplett auslesen möchte. Es gibt zwar schon einige Views, nur sind diese nicht ausreichend für meine Bedürfnisse und leider kann ich diese nicht anpassen, da mir das Wissen zu SQL fehlt. Zur Struktur: Die DB beinhaltet Krebspatienten (Tabelle Patienten), deren Aufenthalte im Krankenhaus (Tabelle Aufenthalte), Therapie, Operationen u.a. Die Tabellen sind inhaltlich verschachtelt, d.h. ein Patient kann mehrere Aufenthalte haben und je Aufenthalt z.B. mehrere Operationen und Therapien. Den View, den ich habe liest mir aber immer nur den 1. Wert je Patient aus. Das Ziel soll es aber sein, dass ich am Ende zu jedem Patienten alle Informationen habe. Ich habe den View unten angefügt, über Tipps würde ich mich sehr freuen:

CREATE VIEW alle_Daten AS
      SELECT 
            P.Id, 
            P.Id_ha,
            P.Historynr,
            P.Personkenz,
            P.Id_osp,
            P.Aufnahmenr,
            P.Name,
            P.Vorname,
            P.Strasse,
            P.Ort,
            P.Plz,
            P.Land,
            P.Gebdatum,
            P.Lkontakt,
            getSymbol('ValueStatus',P.Status) AS Status,
            getSymbol('ValueGeschlecht',P.Geschlecht) AS Geschlecht,
            getSymbol('ValueTodesursache',P.Todesursache) AS Todesursache,	
            getSymbol('ValueT',D.T) AS T, 
            getSymbol('ValueN',D.N) AS N, 
            getSymbol('ValueM',D.M) AS M, 
            getSymbol('ValueR',D.R) AS R, 
            getSymbol('ValuePc',D.Pc) AS Pathologisch_Klinisch,
            getSymbol('ValueJaNein',D.Y) AS Y_TNM,
            D.Diagdatum AS Diagnosedatum,
            getSymbol('ValueRezidiv',D.Rezidiv) AS Rezidiv,
            D.Rezidivdatum,
            getSymbol('ValueJaNein',D.Erstdiag) AS Erstdiagnose,
            getSymbol('ValueTneu2010',D.T) AS Tneu, 
            getSymbol('ValueNneu2010',D.N) AS Nneu, 
            getSymbol('ValueMneu2010',D.M) AS Mneu, 
            getSymbol('ValueGrading',D.Grading) AS Grading, 
            getSymbol('ValueLokalisation',D.Lokal) AS Lokalisation, 
            getSymbol('ValueLymphL',D.LymphL) AS L, 
            getSymbol('ValueLymphV',D.LymphV) AS V, 
            getSymbol('ValueHisto',D.Histologie) AS Histologie,
            D.Icdoda AS ICD_O_DA, 
            T.Beginn AS Therapiebeginn,
            T.Ende AS Therapieende,
            getSymbol('ValueArtOp',T.ArtOp) AS ArtOp, 
            **getSymbol('ValueHaupttherapie',T.Hauptth) AS Haupttherapie, 
            **getSymbol('ValueArtchemo',T.Artchemo) AS Chemotherapie,
            T.Dosis AS Dosis_in_Gy,
            getSymbol('ValueCurPal',T.CurPal) AS KurativPaliativ,
            getSymbol('ValueJaNein',T.Adjuvant) AS Adjuvant, 
            getSymbol('ValueJaNein',T.Neoadjuvant) AS Neoadjuvant,
            T.Bemerkung,
            T.Ort AS Therapie_Ort,
            getSymbol('ValueNeoadjuvant',T.NeoadjuvantType) AS NeoadjuvantType, 
            R.Groesse,
            R.Gewicht,
            getSymbol('ValueJaNein',R.Diabetes) AS Diabetes, 
            getSymbol('ValueJaNein',R.HerzKreisl) AS Herzkreislauf, 
            getSymbol('ValueJaNein',R.ChrBronchit) AS ChronischeBronchitis, 
            R.Kreatinin,
            getSymbol('ValueJaNein',R.Raucher) AS Raucher, 
            R.NichtRSeit AS Nichtraucherseit,
            getSymbol('ValueOrganbefall',R.Organbefall) AS Zweitkarzinom,
            R.Zkarzinom AS Zweitkarzinom_Datum,
            R.PackYears As PackYears,
            T.ArtOp AS ArtOp2, 
            L.pO2Max AS pO2Max,
            L.DLCO,
            L.ForceExp,
            L.VC,
            L.Vo2max AS VO2Max,
      to_char(D.DiagDatum, 'YYYY') AS DiagYear,
      to_number(to_char(age(P.LKontakt,D.DiagDatum),'Y'),'999')
      +to_number(to_char(age(P.LKontakt,D.DiagDatum),'MM'),'999')/12
      +to_number(to_char(age(P.LKontakt,D.DiagDatum),'DD'),'999')/310 AS Time2event,
      to_number(to_char(age(P.LKontakt,T.Beginn),'Y'),'999')
      +to_number(to_char(age(P.LKontakt,T.Beginn),'MM'),'999')/12
      +to_number(to_char(age(P.LKontakt,T.Beginn),'DD'),'999')/310 AS Time2event_Therapie_Beginn 
FROM Patient P,Aufenthalt A, Diagnose D, Therapie T, Risiko R, Lungenfunktion L
WHERE P.Id = A.Id_Patient   
      AND P.Verwertbar = 1
      AND D.Id_Auf = A.Id
      AND T.Id = (SELECT MIN(sT.Id) FROM Therapie sT WHERE sT.Id_Diag = D.Id)
      AND R.Id = (SELECT MIN(sR.Id) FROM Risiko sR WHERE sR.Id_Auf = A.Id)
      AND L.Id = (SELECT MIN(sL.Id) FROM Lungenfunktion sL WHERE sL.Id_Auf = A.Id);

Willkommen.

SQL kann man lernen, das ist gar nicht so schwer. Zuerst einmal mußt Du verstehen, wie ein JOIN funktioniert. Dein Problem man ganz doll verkleinert:

test=# create table patienten (id serial primary key, name text);
NOTICE:  CREATE TABLE will create implicit sequence "patienten_id_seq" for serial column "patienten.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "patienten_pkey" for table "patienten"
CREATE TABLE
test=*# create table behandlungen (id serial primary key, patient int references patienten, datum date);
NOTICE:  CREATE TABLE will create implicit sequence "behandlungen_id_seq" for serial column "behandlungen.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "behandlungen_pkey" for table "behandlungen"
CREATE TABLE
test=*# insert into patienten values (1, 'patient1');
INSERT 0 1
test=*# insert into patienten values (2, 'patient2');
INSERT 0 1
test=*# insert into behandlungen values (1,1,'2013-01-01');
INSERT 0 1
test=*# insert into behandlungen values (2,2,'2013-02-01');
INSERT 0 1
test=*# insert into behandlungen values (3,1,'2013-04-01');
INSERT 0 1
test=*# insert into behandlungen values (4,2,'2013-05-01');
INSERT 0 1
test=*# select p.*, b.* from patienten p left join behandlungen b on p.id=b.patient;
 id |   name   | id | patient |   datum
----+----------+----+---------+------------
  1 | patient1 |  1 |       1 | 2013-01-01
  2 | patient2 |  2 |       2 | 2013-02-01
  1 | patient1 |  3 |       1 | 2013-04-01
  2 | patient2 |  4 |       2 | 2013-05-01
(4 rows)

Es gibt Tonnen von Doku zu JOIN in SQL, lesen & verstehen.

Vielen Dank für den Hinweis zu Join akretschmer!