Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zwei Tabellen -> Dreifach Joinen ? (https://www.delphipraxis.net/96820-zwei-tabellen-dreifach-joinen.html)

HolgerCW 31. Jul 2007 11:23

Datenbank: ORACLE • Version: 9 • Zugriff über: DATABASE

Zwei Tabellen -> Dreifach Joinen ?
 
Hallo zusammen,

In Tabelle1 sind die Stammdaten. In Tabelle2 die Auftraege. Diese Tabellen sehen so aus:

Tabelle.1
Spalte.ID, Spalte.Name
1, Testwert1
2, Testwert2

Tabelle.2
Spalte.ID_Tabelle1, Spalte.Auftrags_Datum, Spalte.Auftragstyp
1, 01.01.2007, 1
1, 25.01.2008, 2

Am Ende soll je nach Auftragstyp die Spalten so gefüllt sein:

Gejointe.Tabelle
Spalte.ID, Spalte.Auftrags_Datum.1, Spalte.Auftrags_Datum.2, Spalte.Auftrags_Datum.3, Spalte.Name
1, 01.01.2007, 25.01.2008, NULL, Testwert1
2, NULL, NULL, NULL, Testwert2

Es soll also eine Zeile ergeben. Es gibt verschiedene Typen von Aufträgen. Wenn zu Spalte.ID z.B. ein Auftrag mit Auftragstyp1 und einer mit Auftragstyp2 existiert soll in Spalte.Auftrags_Datum.1 das Datum von dem Auftrag mit Auftragstyp1 und in Spalte.Auftrags_Datum.2 das Datum von dem Auftrag mit Auftragstyp2 stehen.

Ich hoffe mir kann geholfen werden ;)

Gruss

Holger

mkinzler 31. Jul 2007 11:37

Re: Zwei Tabellen -> Dreifach Joinen ?
 
Ich würde Tabelle2 noch einen eigene PK verpassen.

Das Problem an sich kann man mit Subqueries lösen:

SQL-Code:
select
    t1.ID, (select Datum from Tabelle2 where ID_Tabelle1 = t1.ID and Typ=1) as Datum1,
    (select Datum from Tabelle2 where ID_Tabelle1 = t1.ID and Typ=2) as Datum2,
    (select Datum from Tabelle2 where ID_Tabelle1 = t1.ID and Typ=3) as Datum3, t1.name
from
     Tabelle1 t1;

HolgerCW 31. Jul 2007 12:55

Re: Zwei Tabellen -> Dreifach Joinen ?
 
Vielen dank,
das konnte ich jetzt umsetzen.

Um aber dieses anzuwenden, müssen ja vorher die beiden Tabellen gejoint werden, sonst kann ich ja nicht die WHERE - Abfrage machen.
Wie joine ich die denn dann vorher am besten ? oder verstehe ich da was falsch ?

Gruss

Holger

mkinzler 31. Jul 2007 13:02

Re: Zwei Tabellen -> Dreifach Joinen ?
 
Wie sieht die Bedinmgung aus?
Alternativ kannstz du auch Joins statt Subqueries nehmen

HolgerCW 31. Jul 2007 13:20

Re: Zwei Tabellen -> Dreifach Joinen ?
 
Hi,

habe es nun auch ohne vorher zu joinen hin bekommen. Jetzt muss ich nur noch die Subquery in eine Function kriegen, damit ich die an verschiedenen stellen nutzen kann.

Vielleicht eine Idee. Kann ja leider nicht Datum1 an anderer Stelle im SQL wieder verwenden...

Bräuchte aber jetzt das Ergebnis Datum1 mehrmals an anderer Stelle.

Gruss

Holger

mkinzler 31. Jul 2007 18:34

Re: Zwei Tabellen -> Dreifach Joinen ?
 
Man könnte das in einer Prozedur erledigen

HolgerCW 1. Aug 2007 07:50

Re: Zwei Tabellen -> Dreifach Joinen ?
 
Du meinst jetzt eine procedure ausserhalb SQL ?

Ich hatte vorher auch alles unter CalcFields. Nur dann konnte ich nach den CalcFields nicht sortieren.

Deshalb packe ich das zur Zeit alles in eine RIESIGE SQL - Abfrage.

Gruss

Holger

mkinzler 1. Aug 2007 07:56

Re: Zwei Tabellen -> Dreifach Joinen ?
 
Nein ich meinte eine Stored Procedure innerhalb der DB

HolgerCW 1. Aug 2007 08:19

Re: Zwei Tabellen -> Dreifach Joinen ?
 
Das hört sich interresant an. Wie kann ich das in Delphi realisieren ?

Möchte Quasi diese Abfrage: (Ist ein Teil aus der Gesamt-Query)

Delphi-Quellcode:
(CASE WHEN
(SELECT AUFTRAGERLEDIGT FROM SYSDBP.DBP_AUFTRAEGE WHERE SYSDBP.DBP_AUFTRAEGE.ANLAGENNUMMER = SYSDBP.DBP_LEISTUNGSWERTE.ANLAGENNUMMER AND SYSDBP.DBP_AUFTRAEGE.SIGMA_TAETIGKEIT_ID = '133' AND
(SYSDBP.DBP_AUFTRAEGE.AUFTRAGERLEDIGT = (SELECT MAX(SYSDBP.DBP_AUFTRAEGE.AUFTRAGERLEDIGT) FROM SYSDBP.DBP_AUFTRAEGE WHERE SYSDBP.DBP_LEISTUNGSWERTE.ANLAGENNUMMER = SYSDBP.DBP_AUFTRAEGE.ANLAGENNUMMER
SYSDBP.DBP_LEISTUNGSWERTE.ANZAHL = SYSDBP.DBP_AUFTRAEGE.DB_REGISTER AND SYSDBP.DBP_AUFTRAEGE.SIGMA_AUFTYP_ID = '50' AND SYSDBP.DBP_AUFTRAEGE.STATUS = 'abgeschlossen')))
IS NOT NULL THEN
ADD_MONTHS((SELECT AUFTRAGERLEDIGT FROM SYSDBP.DBP_AUFTRAEGE WHERE SYSDBP.DBP_AUFTRAEGE.ANLAGENNUMMER = SYSDBP.DBP_LEISTUNGSWERTE.ANLAGENNUMMER AND SYSDBP.DBP_AUFTRAEGE.SIGMA_TAETIGKEIT_ID = '133' AND
(SYSDBP.DBP_AUFTRAEGE.AUFTRAGERLEDIGT = (SELECT MAX(SYSDBP.DBP_AUFTRAEGE.AUFTRAGERLEDIGT) FROM SYSDBP.DBP_AUFTRAEGE WHERE SYSDBP.DBP_LEISTUNGSWERTE.ANLAGENNUMMER = SYSDBP.DBP_AUFTRAEGE.ANLAGENNUMMER
AND SYSDBP.DBP_LEISTUNGSWERTE.ANZAHL = SYSDBP.DBP_AUFTRAEGE.DB_REGISTER AND SYSDBP.DBP_AUFTRAEGE.SIGMA_AUFTYP_ID = '50' AND SYSDBP.DBP_AUFTRAEGE.STATUS = 'abgeschlossen'))), FESTIGKEIT_JAHRE * 12)
ELSE CASE
WHEN FESTIGKEIT_JAHRE <> 0 THEN ADD_MONTHS(TO_DATE('01.01.2006'), FESTIGKEIT_JAHRE * 12) WHEN FESTIGKEIT_JAHRE = 0 THEN NULL END
END) AS FESTIGKEITPRUEFUNG,
... dann wieder verwenden. In dem ich nur 'FESTIGKEITPRUEFUNG' in die nächste Abfrage einbauen muss.

Wie geht das mit der procedure oder function, da ich ja einen Wert an die nächste Abfrage übergeben will.

Wie rufe ich dann die Procedure oder Function 'FESTIGKEITPRUEFUNG' auf ?

Man sieht ja auch oben, das die 'SELECT AUFTRAGERLEDIGT ...' doppelt ist. Schon den Teil könnte man schön in eine PRocedure oder Function packen. Nur wie läuft das ?

Die Abfragen ergeben dann eine grosse TQuery.

Gruss

Holger

mkinzler 1. Aug 2007 08:23

Re: Zwei Tabellen -> Dreifach Joinen ?
 
Nicht in Delphi in PL/SQL


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz