Hallo ihr lieben Leute,
vielleicht kann mir mal jemand fix auf die Sprünge helfen. Ich habe in eine DB eine simple Baumstruktur:
+-----------------------------------+ | sohn | vater | aktiv | +-----------------------------------+ | 1 | 0 | 1 | | 2 | 1 | 1 | | 3 | 2 | 0 | | 4 | 2 | 1 | | 5 | 3 | 1 | | 6 | 3 | 1 | ....
Ich will jetzt alle aktiven sohn - Vater - Beziehungen haben, bei denen nicht nur die aktuelle Beziehung aktiv ist, sondern alle Väter bis obenhin. am konkreten Beispiel muss also sowss rauskommen:
1 -> 0 2 -> 1 4 -> 2
Es dürfen NICHT erscheinen:
3 -> 2 (das ist einfach) 5 -> 3 6 -> 3
wie erschlage ich das in möglichst wenigen Schritten? Die Sache mit den Nested Sets habe ich mir schon angeschaut, das triffts hier aber nicht ganz. Und wie immer, sind die Daten schon da und natürlich recht umfangreich und verschachtelt.
Muss ich wirklich was rekursives bauen oder gibts dafür 'ne prima Logik:
Gibt mir alle Vater-Sohn-Beziehungen aus, die in Ihrem Stammbaum nicht irgendwo inaktiv sind.
Mit freundlichen Grüßen
Jens Puruckherr
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Hallo!
On Wednesday 04 February 2004 16:11, Jens Puruckherr wrote:
Hallo ihr lieben Leute,
vielleicht kann mir mal jemand fix auf die Sprünge helfen. Ich habe in eine DB eine simple Baumstruktur:
+-----------------------------------+
| sohn | vater | aktiv |
+-----------------------------------+
| 1 | 0 | 1 | | 2 | 1 | 1 | | 3 | 2 | 0 | | 4 | 2 | 1 | | 5 | 3 | 1 | | 6 | 3 | 1 |
....
Ich will jetzt alle aktiven sohn - Vater - Beziehungen haben, bei denen nicht nur die aktuelle Beziehung aktiv ist, sondern alle Väter bis obenhin. am konkreten Beispiel muss also sowss rauskommen:
1 -> 0 2 -> 1 4 -> 2
Es dürfen NICHT erscheinen:
3 -> 2 (das ist einfach) 5 -> 3 6 -> 3
wie erschlage ich das in möglichst wenigen Schritten? Die Sache mit den Nested Sets habe ich mir schon angeschaut, das triffts hier aber nicht ganz. Und wie immer, sind die Daten schon da und natürlich recht umfangreich und verschachtelt.
Muss ich wirklich was rekursives bauen oder gibts dafür 'ne prima Logik:
Gibt mir alle Vater-Sohn-Beziehungen aus, die in Ihrem Stammbaum nicht irgendwo inaktiv sind.
Ich hab da ne Idee, weiß aber nicht, ob das wirklich funktioniert. 1. SELECT * FROM table WHERE aktiv=1 2. Inner Join des Ergebnisses mit table wobei result.vater = table.sohn
Vielleicht ist das ja ein Ansatz...
Mit freundlichen Grüßen
Jens Puruckherr
cu Markus
Ich habs! Es ist eigentlich total simple, man muss wie immer nur drauf kommen. Mein Verzeichnis als schöne XML-Struktur:
.... our $sth = $dbh->prepare(q{SELECT ARTKATEGORIE as sohn from WS_ARTKATEGORIE where BGRARTKATEGORIE = ? and aktiv = 1 and shopid =1});
&loop(0); # von ganz oben Anfangen
sub loop{ my $start = shift; my $ref = getSohn($start); return unless ref($ref) eq "ARRAY";
foreach (@{$ref}) { print "<_".$_->[0].">"; &loop($_->[0]); print "</_".$_->[0].">"; } }
sub getSohn{ my $sohn = shift; # holt alle Söhne zum Vater $sth->execute($sohn) || die ("Fehler execute getSohn\n"); return if $sth->rows == 0; my $ref = $sth->fetchall_arrayref; return $ref; }
$sth->finish; $dbh->disconnect;
Mit freundlichen Grüßen
Jens Puruckherr IT & Technik --------------------------------------------- cyberport.de GmbH Versandhaus für Technik & Lifestyle
Am Brauhaus 5 01099 DRESDEN Fon: +49 (0)351/ 33 95 -7808 Webseite: http://www.cyberport.de --------------------------------------------
Jens Puruckherr wrote:
Hallo ihr lieben Leute,
Hallo,
vielleicht kann mir mal jemand fix auf die Sprünge helfen. Ich habe in eine DB eine simple Baumstruktur:
[Transitive Beziehungen in der relationalen DB]
wie erschlage ich das in möglichst wenigen Schritten?
Ohne jetzt genau hingeschaut zu haben: Suchst du eventuell nach LEFT OUTER JOIN ?
Mehr gibt's hier, wenn du nach left outer join suchst.
http://www.sap-img.com/oracle-database/examples-sql-dml-statements.htm
[...]
Mit freundlichen Grüßen
Jens Puruckherr
Jens
lug-dd@mailman.schlittermann.de