Extreme Veteran
Beiträge: 566
| Hallo,
cdt_roger - 13.04.14 21:16
SELECT Tbl_Stunden.H_Mitglied, Tbl_Stunden.H_Abrechnung, Tbl_Stunden.H_Stun_Feier, Tbl_Stunden.H_Stun_Nacht, Tbl_Stunden.H_Stun_Tag, Tbl_Stunden.H_Wehrbezahlt, Tbl_Berichte.B_Datum, IIf([B_Eupen],"Eupen",IIf([B_Raeren],"Raeren",IIf([B_Baelen],"Baelen",[B_Gemeinde]))) AS Gemeinde, Tbl_Einsatzcodes.C_E_EInsatzart_Titel
FROM Tbl_Einsatzcodes RIGHT JOIN (Tbl_Berichte RIGHT JOIN Tbl_Stunden ON Tbl_Berichte.B_ID = Tbl_Stunden.H_Einsatznr) ON Tbl_Einsatzcodes.C_E_Code_Komplett = Tbl_Berichte.B_Einsatz_Meldung_Code
WHERE (((Tbl_Stunden.H_Abrechnung) Is Null))
ORDER BY Tbl_Berichte.B_Datum;
Ohne genau zu wissen, wie die Jet-Engine mit der Performance bei den RIGHT JOINs umgeht, würde ich stattdessen mit LEFT JOINs arbeiten, was zumindest die Lesbarkeit erhöht. Aus demselben Grund würde ich Aliase verwenden:
SELECT S.H_Mitglied, S.H_Abrechnung, S.H_Stun_Feier, S.H_Stun_Nacht, S.H_Stun_Tag, S.H_Wehrbezahlt, B.B_Datum, IIf([B_Eupen],"Eupen",IIf([B_Raeren],"Raeren",IIf([B_Baelen],"Baelen",[B_Gemeinde]))) AS Gemeinde, E.C_E_EInsatzart_Titel
FROM ( Tbl_Stunden AS S LEFT JOIN Tbl_Berichte AS B ON S.H_Einsatznr = B.B_ID ) LEFT JOIN Tbl_Einsatzcodes AS E ON B.B_Einsatz_Meldung_Code = E.C_E_Code_Komplett
WHERE S.H_Abrechnung Is Null
ORDER BY B.B_Datum;
Ansonsten:
- Hast du Daten in Tbl_Stunden, fuer die es keine Rows in Tbl_Berichte gibt? Falls ja ist der LEFT JOIN ok. Ansonsten solltest du stattdessen INNER JOIN verwenden. Gleiches gilt fuer Tbl_Berichte und Tbl_Einsatzcodes.
- Die geschachtelten IIFs zeigen, dass es wohl ein Problem mit dem Datenmodell gibt. B_Eupen, B_Raeren usw. sind Ja/Nein-Felder? Was ist der Hintergrund für diesen Ansatz?
- Auf folgenden Feldern sollte jeweils ein Index liegen:
- - Tbl_Stunden.H_Einsatznr
- - Tbl_Stunden.H_Abrechnung
- - Tbl_Berichte.B_ID
- - Tbl_Berichte.B_Einsatz_Meldung_Code
- - Tbl_Berichte.B_Datum
- - Tbl_Einsatzcodes.C_E_Code_Komplett
----- Gruss - Peter |