![]() |
Datenbank: Firebird Embedded • Version: 2.1 • Zugriff über: Zeos
Firebird - Rekursive SQL mit mehreren "Ebenen"
Hallo,
ich hatte damals schonmal Hilfe bekommen, weil ich mich mit rekursiven SQL-Abfragen garnicht auskannte. Habe das damalige Problem mit eurer Hilfe auch lösen können, stehe aber wieder vor einen Problem, welches ich auch trotz vieler Versuche nicht gelöst bekomme. Mein Ziel ist es, in eine Treeview alle Ordner, deren x-beliebige Unterordner und alle Artikel auszulesen, die die Ordner enthalten. Dabei soll alles (Ordnernamen und Artikelnamen) jeweils alphabetisch sortiert werden. Die SQL-Abfrage für die (Sub-)Ordner in alphabetische Reihenfolge habe ich schon. Es fehlen nur noch die jeweiligen Artikel. Ich würde gerne vermeiden, deswegen eine neue SQL-Abfrage auszuführen - oder wäre dies sinnvoller bzw. die einzige Möglichkeit? Hier mal die Tabellen und der Quellcode....: Tabelle für die Ordner "Ablage":
Code:
Tabelle für die Artikel
ID | VATER | ORDNERNAME
Code:
ID | ORDNERID | TITEL
Delphi-Quellcode:
Vielleicht geht es auch nicht anders, als zwei Statements ausführen zu lassen. Vielleicht habt ihr noch eine Idee. Aber ganz allgemein: Rekursion fällt mir seeehr schwer...
db.sql('WITH RECURSIVE ordner AS ' +
' (SELECT * FROM ABLAGE) ' + 'SELECT * FROM ABLAGE k ' + ' LEFT JOIN ordner o ' + ' ON (o.id = k.vater) ORDER BY k.vater ASC, k.ordnername ASC'); Danke im Voraus |
AW: Firebird - Rekursive SQL mit mehreren "Ebenen"
Für den Notfall kannste ja immer noch einen Block nehmen.
Aber dies ist noch kein Notfall. Folgendes Statement
SQL-Code:
sollte dir helfen.
with recursive cte as (
select o.id ordner_id, null artikel_id, o.ordnername from ordner o where o.parent is null union all select null ordner_id, id artikel_id, a.titel from artikel a inner join cte on a.ordner = cte.ordner_id union all select o.id ordner_id, null artikel_id, o.ordnername from ordner o inner join cte on cte.ordner_id = o.parent ) select * from cte Kleiner Schönheitsfehler: das Sortieren hab ich jetzt nicht geschafft. Aber das kann ja auch die GUI machen. (jeder vernünftigen TreeView kann das ja ;) ) |
AW: Firebird - Rekursive SQL mit mehreren "Ebenen"
Hallo,
sorry dass ich mich jetzt erst melde, aber ich habe mir eine kleine Auszeit genommen. Habe also auch jetzt erst dein (SQL-)Statement genauer angesehen. Habe dazu auch eine Frage. Was bedeutet in diesem Zusammenhang "null"? Also, die Bedeutung von "null" kenne ich schon, aber warum steht das im "Select" und auch noch vor Artikel-ID? Ist das vielleicht deswegen, weil es ja nicht immer Artikel gibt, sodass der Default-Wert "null" ist? Hier nochmal die Stelle(n):
Code:
select o.id ordner_id, null artikel_id, o.ordnername
Code:
select null ordner_id,
Code:
Wäre nett, wenn du mir diese Stellen nochmal erklären könntest.
select o.id ordner_id, null artikel_id, o.ordnername
Achja: Und was ist "besser": Die Sortierung durch SQL, durch die GUI oder ganz einfach egal? Danke sehr. |
AW: Firebird - Rekursive SQL mit mehreren "Ebenen"
Im Gegnteil es wird jeweils eine Null Wert durch diese Abfrage erzeugt.
|
AW: Firebird - Rekursive SQL mit mehreren "Ebenen"
Naja ... bei so einem rekursiven CTE wird ja das aktuelle Resultat immer wieder mit dem aktuellen select gejoint.
Also muss man ja erkennen, wann es ein Ordner und wann ein Artikel ist (wenn man das nicht machen würde, würde man entweder eine Endlos-Schleife bauen oder die falschen ID's vergleichen). Mein Query liefert für alle Artikel die Ordern_ID null und bei den Ordnern eben umgekehrt. So kann man sie unterscheiden. Ich weiß, das ist kompliziert. Das Beste ist, wenn du dir das Query nimmst, an deine Tabellen anpasst und dann damit rumspielst und beobachtest, was passiert. |
AW: Firebird - Rekursive SQL mit mehreren "Ebenen"
Guten Abend!
Hänge gerade wieder an dem Statement dran. Stelle mir gerade die Frage, warum ich überhaupt ein rekursives Statement bauen möchte. Wäre es nicht einfacher - auch im Hinblick auf die Sortierung - zwei Statements zu benutzen? Im ersten Schritt lade ich alle Ordner. Anhand von "parent" erkenne ich, ob es ein Ordner oberster Ebene ist (parent = -1) oder eben ein Unterordner (parent <> -1). Jeder Ordner wird einem Objekt in Delphi zugeordnet. So bilde ich die Ordnerstruktur objektorientiert ab. Danach wird die zweite SQL ausgeführt, welche alle Artikel- und Ordner-IDs liefert. In Delphi werden dann die Artikel-Objekte erstellt und dem entsprechenden Ordner-Objekt angefügt. Danach wird die Objekte in die Treeview geladen. Welche Vorteile würde mir hier die Rekursion im SQL bieten und wie würde ein Beispielsdatensatz aussehen. Kann mir das gerade nicht vorstellen und momentan auch nicht an meine Datenbank anpassen. Danke |
AW: Firebird - Rekursive SQL mit mehreren "Ebenen"
Also zwecks "Verstehbarkeit" und "Erweiterbarkeit" würde ich 2 Statements empfehlen. Das Ganze mit einer CTE zu machen hätte nur Coolness-Gründe. ;)
|
AW: Firebird - Rekursive SQL mit mehreren "Ebenen"
Zitat:
Hm, eigentlich bin ich ja so drauf... ich um das richtig zu verstehen etc fehlt mir gerade die Zeit. Also werde ich doch wieder zwei Statements erstellen. ABER: Ich werde darauf zurückkommen. Ich mag es nicht, wenn ich was nicht verstehe! Vielen Dank! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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-2025 by Thomas Breitkreuz