AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken wie setze ich "connect by" richtig ein
Thema durchsuchen
Ansicht
Themen-Optionen

wie setze ich "connect by" richtig ein

Ein Thema von p80286 · begonnen am 8. Apr 2011 · letzter Beitrag vom 7. Jun 2011
Antwort Antwort
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

wie setze ich "connect by" richtig ein

  Alt 8. Apr 2011, 16:47
Datenbank: Oracle • Version: 9 • Zugriff über: egal
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: wie setze ich "connect by" richtig ein

  Alt 8. Apr 2011, 17:27
ich habe zwei Tabellen, Personen und Vererbung
Vererbung hat drei Felder: Erblasser,Anteil,Erbe
bitte konkreter! So kann man dir nicht helfen.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: wie setze ich "connect by" richtig ein

  Alt 10. Apr 2011, 13:54
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: wie setze ich "connect by" richtig ein

  Alt 10. Apr 2011, 20:56
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.

Geändert von omata (11. Apr 2011 um 00:46 Uhr)
  Mit Zitat antworten Zitat
borwin

Registriert seit: 14. Sep 2006
Ort: Rostock
72 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: wie setze ich "connect by" richtig ein

  Alt 11. Apr 2011, 08:42
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: wie setze ich "connect by" richtig ein

  Alt 7. Jun 2011, 12:54
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 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