![]() |
Datenbank: InterBase • Version: 7.5 • Zugriff über: DatabaseWorkbench 4
(Rekursive) Suche von Objekten in der DB
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich habe einen Teil meiner Datenbank wie in dieser Grafik aufgebaut: Anhang 34499 Hier sind also insgesamt drei Tabellen. Eine mit Objekten, eine mit Kategorien und eine in der ich Objekte mit Kategorien verknüpft habe. Nun soll der Nutzer wählen können, welche Objekte er sehen möchte. Dazu soll er die Möglichkeit haben, mehrere Kategorien zu wählen und ein Vorgänger Objekt zu wählen. Die angezeigten Objekte sollen dann alle Kriterien erfüllen. Das Ganze habe ich versucht mit rekursiven Aufrufen zu lösen, doch sind mir diese immer wieder um die Ohren geflogen. Mein aktueller Versuch sieht so aus:
Code:
Hier ist allerdings das Problem, dass nicht alle Kindeskinder angezeigt werden. Es hört nach der ersten Ebene auf. Auch die Performance ist nicht sonderlich toll.
begin
select ID, ID_PARENT, C_NAME from OA_CATEGORIES where ID = :AID into :id, :parent, :C_NAME; suspend; for select ID, ID_PARENT, C_NAME from OA_CATEGORIES where ID_PARENT = :aid into :id, :parent, :C_NAME DO suspend; begin suspend; for select id, parent, c_name from p_oa_sub_cats(:id) into :id, :parent, :C_NAME do suspend; end end Habt ihr Vorschläge, wie ich das Problem lösen könnte? Auch kleine Änderungen der DB wären noch möglich, da ich mich noch am Anfang des Projekts bin. Ich freue mich auf eure Ideen Gruß Chris |
AW: (Rekursive) Suche von Objekten in der DB
Du führst dies auch nur für eine Unterebene aus.
Packe die Abfrage in eine SP, welche sich selber aufruft, wenn Detaildatensätze existieren. Hier würde sich auch CTE anbieten (wenn IB das unterstützt) |
AW: (Rekursive) Suche von Objekten in der DB
Hi,
danke für die schnelle Antwort. Ich rufe die Prozedur rekursiv auf: Hier nochmal in DDL:
Code:
Über die zweite For-Schleife mit p_oa_sub_cats(:id) sollte sich die Prozedur doch selbst rekursiv aufrufen, oder sehe ich das falsch?
SET TERM ^^ ;
CREATE PROCEDURE P_OA_SUB_CATS ( AID Integer) returns ( ID Integer, PARENT Integer, C_NAME VarChar(64)) AS begin select ID, ID_PARENT, C_NAME from OA_CATEGORIES where ID = :AID into :id, :parent, :C_NAME; suspend; for select ID, ID_PARENT, C_NAME from OA_CATEGORIES where ID_PARENT = :aid into :id, :parent, :C_NAME DO suspend; begin suspend; for select id, parent, c_name from p_oa_sub_cats(:id) into :id, :parent, :C_NAME do suspend; end end ^^ SET TERM ; ^^ Für was steht SP? Mit CTE habe ich noch nie gearbeitet und weiß auch nicht ob es unter IB geht. Vielleicht hat ja noch jemand eine andere Idee oder kann mir evtl. zeigen, wie es ich mit CTE an mein Ziel komme. Gruß Chris |
AW: (Rekursive) Suche von Objekten in der DB
Hey ich hatte gestern das gleiche Problem und hab heute eine Akteptable Lösung geboten bekommen!
SP steht für stored Prozedures. Ist eine Datenbankprozedur! hier mein Thread mit Lösung ! ![]() Viele Grüße Helge ;) |
AW: (Rekursive) Suche von Objekten in der DB
Hi
@H3llsing: Danke für dein Link, aber ich komme mit Interbase und dem Cursor nicht weiter. Die Lösung aus diesem Thread, funktioniert für mich leider nicht. Zumindest bekomme ich es nicht zum laufen. Gruß Chris |
AW: (Rekursive) Suche von Objekten in der DB
Ich sehe da keine Rekursion.
Gier schon
SQL-Code:
SET TERM ^ ;
create or alter procedure PBAUM ( IPARENT bigint) returns ( ID bigint, PARENT bigint, TEXT varchar(128)) as declare variable ANZ integer; begin select count(id) from baum where Parent = :iparent into :anz; if (:anz > 0) then for select id, parent, text from baum where parent = :iparent into :id, :parent, :text do begin suspend; for select id, parent, text from pbaum( :id) into :id, :parent, :text do begin suspend; end end end^ SET TERM ; ^ |
AW: (Rekursive) Suche von Objekten in der DB
Danke!
Mit der Lösung von mkinzler habe ich es hin bekommen! Gruß Chris |
AW: (Rekursive) Suche von Objekten in der DB
Statt
Zitat:
SQL-Code:
Ist vermutlich viel schneller, denn 'Count(*)' zählt alle und geht dabei alle (passenden) Datensätze durch, während 'exists' beim ersten Datensatz abbricht.
...
if exists (select id from baum where Parent =:iparent) then ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz