hi,
ich tue mein Bestmögliches aber als Newbie ist mir nicht möglich gewesen dein Beispiel auf meine Daten anzuwenden.
ich habe also “deinen” Code genommen und mit “meinen” Field Namen ersetzt und es probiert. ( copy / paste )
opa | 1 | --unbekannt–
bei “Vorgabe” des “opa” funktioniert dein Beispiel ja wunderbar aber es ist in der “Generation” auf “Enkel” begrenzt.aber es “passt” nicht zu meinen Daten wo auch der “opa” einen Vater haben müsste und der “Enkel” noch ur-ur-ur … “Kinder” haben könnten.
bei mir ist “opa” z.b. ein Ordner im Laufwerk “C:” … und ich hab ja viele Ordner im Root.
wie viele "opa"s ich nun brauche hängt von der Anzeige des Bildschirms ab.
bei einem “click” auf “opa” könnte ich eine Funktion nehmen wie diese
CREATE FUNCTION ListChildren(numeric) RETURNS SETOF numeric AS
'SELECT name FROM nodes WHERE parent = $1'
--and sortIndex < 1
--Aktion Childs z.b. "markieren" Level
--NextVal('sortIndex_Seq') WHERE ???
LANGUAGE SQL;
ich “müsste” mich doch “recursive” durch die “Kinder” wühlen können ohne Begrenzung wie ich es in Xbase++ mache.
die “einfache” Function reicht mir aber noch nicht sondern ich müsste die “erweitern” (Kommentare) wobei ich mir nicht sicher bin “wo” es statt finden muss. das “erweitern” um einen “Level-Index” benötige ich später zum Bildschirmaufbau des TreeView - ListView Control.
da ich durch dein Beispiel neue Stichwörter hatte bin ich auf die suche nach “mehr” Beispielen gegangen.
z.b. diese Beispiel sah für mich ganz vielversprechend aus.
CREATE TABLE supplyitem(si_id integer PRIMARY KEY, si_parentid integer, si_item varchar(100));
--load up the table (multirow constructor introduced in 8.2)
INSERT INTO supplyitem(si_id,si_parentid, si_item)
VALUES (1, NULL, 'Paper'),
(2,1, 'Recycled'),
(3,2, '20 lb'),
(4,2, '40 lb'),
(5,1, 'Non-Recycled'),
(6,5, '20 lb'),
(7,5, '40 lb'),
(8,5, 'Scraps');
--Recursive query (introduced in 8.4 returns fully qualified name)
WITH RECURSIVE supplytree AS
(SELECT si_id, si_item, si_parentid, CAST(si_item As varchar(1000)) As si_item_fullname
FROM supplyitem
WHERE si_parentid IS NULL
UNION ALL
SELECT si.si_id,si.si_item,
si.si_parentid,
CAST(sp.si_item_fullname || '->' || si.si_item As varchar(1000)) As si_item_fullname
FROM supplyitem As si
INNER JOIN supplytree AS sp
ON (si.si_parentid = sp.si_id)
)
SELECT si_id, si_item_fullname
FROM supplytree;
aber wenn ich das für meine Daten “umschreibe” habe ich das selbe Problem mit dem “opa” … (1, NULL, ‘Paper’)
daher auch die Frage
Frage : wie bekomme ich “Opa” ( = 2949666 ) als Parameter übergeben ?
vielleicht stelle ich auch die Frage falsch … kann man “WITH RECURSIVE …” auch “in” eine Function schreiben ?
wenn ja wie kann man für ein Result-Set, per “SELECT * FROM listchildreN(”+parent+“)”, die Function “recursive” aufrufen ?
nach meiner Xbase “Logik” würde ich die Elemente eines Result-Set “einzeln”, in einer FOR / NEXT, die Function ListChildren(numeric) abarbeiten lassen um einen kompletten Baum wiederherzustellen.
ich möchte nicht jedes mal, wie beim Explorer, bei “opa” anfangen wenn ich zuletzt in der 7th “Generation” war
das hast du dir auch verdient wenn du es bis hier geschafft hast
wenn du Zeit hättest dir das Problem noch mal anzusehen … DANKE
hier dazu noch mal meine “lates” Test Daten.
CREATE TABLE nodes(
name numeric,
hitem numeric,
parent numeric,
caption text,
__record serial,
CONSTRAINT nodes_pkey PRIMARY KEY (__record) ) ;
COPY nodes FROM 'X:\TEMP\DATA.CSV' DELIMITER ','
2949666, 1420416, 2949666, "Erste Ebene A",-1
2556452, 1420504, 2556452, "Erste Ebene B",-2
2490924, 1420592, 2949666, "Zweite Ebene A",-3
2359850, 1420680, 2949666, "Zweite Ebene B",-4
2490920, 1420768, 2490924, "Dritte Ebene A",-5
6095334, 1420856, 2490924, "Dritte Ebene B",-6
2949746, 1420944, 2490924, "Dritte Ebene C",-7
in “DATA.CSV” habe jetzt “,” (Komma) als Delimiter.
zusätzlich ist das Field “__record” jetzt Type “serial” ( statt numerisch )
für Newbies : ich hab für die “__record” Werte < 0 gewählt weil sonst diese Meldung kommt
FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »nodes_pkey«
DETAIL: Schlüssel »(__record)=(0)« existiert bereits.
********** Fehler **********
FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »nodes_pkey«
SQL Status:23505
Detail:Schlüssel »(__record)=(0)« existiert bereits.
damit ist auch ein
SELECT setval('nodes___record_seq', 0 ) FROM nodes;
“so” für ein “reset” nicht möglich.
für jeden Kommentar, Ideen oder Tips dankbar wie ich hinter das Geheimniss von PostgreSQL komme.