Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   wie setze ich "connect by" richtig ein (https://www.delphipraxis.net/159702-wie-setze-ich-connect-richtig-ein.html)

p80286 8. Apr 2011 16:47

Datenbank: Oracle • Version: 9 • Zugriff über: egal

wie setze ich "connect by" richtig ein
 
Hallo zusammen,

ich habe zwei Tabellen, Personen und Vererbung
Vererbung hat drei Felder: Erblasser,Anteil,Erbe

Es können "Vererbungsketten" gebildet werden z.B.

P1 - Erbe1 - Erbe2 - Erbe3

in diesen Fällen benötige ich Erbe3 und seinenErbanteil an P1 (Anteil1*Anteil2*Anteil3)

dafür sollte sich eigentlich connect by anbieten, aber das bekomme ich nicht ans Laufen.

Könntet Ihr mir da auf die Sprünge helfen?

Gruß
K-H

omata 8. Apr 2011 17:27

AW: wie setze ich "connect by" richtig ein
 
Zitat:

Zitat von p80286 (Beitrag 1093983)
ich habe zwei Tabellen, Personen und Vererbung
Vererbung hat drei Felder: Erblasser,Anteil,Erbe

bitte konkreter! So kann man dir nicht helfen.

p80286 10. Apr 2011 13:54

AW: wie setze ich "connect by" richtig ein
 
Ich glaube da war mir etwas zu selbsverständlich:
Personen
PersKey,Name,...
Vererbung
Erblasser,Anteil,Erbe

wobei die Abfrage nach dem ersten Erbe so laüft:

Code:
select Erbe1.Name
from Personen,Vererbung,Peronen Erbe1
where Personen.Perskey=Vererbung.Erblasser
  and Erbe.Perskey=Vererbung.Erbe1
Nach dem zweiten Erben (und seinem Vorgänger)

Code:
select Erbe1.Name,Erbe2.Name
from Personen,Vererbung,Peronen Erbe1,Vererbung Vererbung2 
where Personen.Perskey=Vererbung.Erblasser
  and Erbe1.Perskey=Vererbung.Erbe
  and Erbe1.Perskey=Vererbung2.Erblasser
  and Erbe2.Perskey=Vererbung2.Erbe
Ich hoffe das ist etwas ausfürlicher

Gruß
K-H

omata 10. Apr 2011 20:56

AW: wie setze ich "connect by" richtig ein
 
Zitat:

Zitat von p80286 (Beitrag 1094258)
Ich hoffe das ist etwas ausfürlicher

Naja, nicht wirklich.

Es fehlen Beispieldaten. Die Abfragen funktionieren nicht (Schreibfehler; Erbe1, Erbe2 existiert nicht!)

Und es fehlt eine konkrete Vorgabe, bei welchen Eingabedaten was rauskommen soll.

Sorry, Gedankenlesen ist erst nach meinem Zauberlehrgang dran.


Edit:

So, nachdem ich da nochmal etwas drüber nachgedacht habe, denke ich, dass "connect by" hier leider nicht angewendet werden kann, weil dieses Konstrukt eine hierarische Struktur (id, parent_id) innerhalb einer Tabelle vorraussetzt. Diese Vorrussetzungen sind hier nicht gegeben.

borwin 11. Apr 2011 08:42

AW: wie setze ich "connect by" richtig ein
 
Ohne Deine Tabelle jetzt genau zu kennen, gehte es bei Oracle so

Code:

SELECT *
FROM MYTABLE
    START WITH VATER_ID = -1
    CONNECT BY PRIOR SOHN_ID = VATER_ID;
Mit Start With bestimmst Du den Einsprung im Baum. Kannst auch danach Suchen im Web.
Gibt es genügend Beispiele.

Gruß Borwin

p80286 7. Jun 2011 12:54

AW: wie setze ich "connect by" richtig ein
 
ich habs mir ausgwürfelt:
(die Tabelle Name enthält Namen, NameIndividual Vornamen,Geschlecht... , NameSuccessor die Beziehung zwischen Erblasser [NameKey] und Erbe [SuccessorKey], sowie den Erbanteil [Rate]
)
Code:
select Erbl.Name "Erblasser",ErblI.Firstname "ErblasserVorn"
      ,Erbe.Name "Erbe"    ,ErbeI.Firstname "ErbeVorn"
      ,Namesuccessor.*,level
from NameSuccessor
    ,Name Erbl,Nameindividual ErblI
    ,Name Erbe,Nameindividual ErbeI
where Erbl.Namekey=Namesuccessor.Namekey
  and Erbe.Namekey=NameSuccessor.SuccessorNameKey
  and ErbeI.NameKey=Erbe.NameKey
  and ErblI.NameKey=Erbl.NameKey
--  start with NameSuccessor.Namekey=123456
  connect by Namesuccessor.Namekey=prior Namesuccessor.Successornamekey
Mit Dieser Abfrage bekomme ich alle Erbschaftsverhältnisse angezeigt, und es ist Nachvollziebar wer von wem, wieviel (NameSuccessor.Rate)geerbt hat.
Soll die Ausgabe sich nur auf einen Erblasser beziehen so wird
Code:
start with NameSuccessor.Namekey=123456
eingeschoben.

Wird eine Liste oder ein EndErbe benötigt,erhält man die Daten hierüber:
Code:
select distinct Erbe.Name "Erbe",ErbeI.Firstname "ErbeVorn"
from NameSuccessor
    ,Name Erbl,Nameindividual Erbli
    ,Name Erbe,Nameindividual Erbei
where Erbl.Namekey=Namesuccessor.Namekey
  and Erbe.Namekey=Namesuccessor.SuccessorNameKey
  and ErbeI.NameKey=Erbe.NameKey
  and ErblI.NameKey=Erbl.NameKey
  and not exists(select * from namesuccessor a where a.NameKey=Namesuccessor.Successornamekey)
--  start with NameSuccessor.Namekey=123456
  connect by Namesuccessor.namekey=prior Namesuccessor.Successornamekey
Wobei Erbl hier eigentlich überflüssig ist. Über not exists() werden alle Datensätze aus der Ausgabe verbannt, in denen Erben auch Erblasser sind. Es bleiben also nur Erben übrig.
Wird nur der oder die Enderben zu einem Erblasser gesucht kann auf das distinct verzichtet werden, da eine eindeutige Beziehung vorliegt.
Erst wenn ein Erbe der Endpunkt einer "Erbenkette" ist, wird die Unterdrückung von Mehrfachnennungen durch distinct notwendig.

Vielleicht hilft's dem einen oder anderen.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.

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