AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird - Rekursive SQL mit mehreren "Ebenen"
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird - Rekursive SQL mit mehreren "Ebenen"

Ein Thema von TheMiller · begonnen am 21. Okt 2010 · letzter Beitrag vom 26. Okt 2010
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Firebird - Rekursive SQL mit mehreren "Ebenen"

  Alt 21. Okt 2010, 13:46
Datenbank: Firebird Embedded • Version: 2.1 • Zugriff über: Zeos
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:
ID | VATER | ORDNERNAME
Tabelle für die Artikel

Code:
ID | ORDNERID | TITEL
Delphi-Quellcode:
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');
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...

Danke im Voraus
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Firebird - Rekursive SQL mit mehreren "Ebenen"

  Alt 21. Okt 2010, 21:28
Für den Notfall kannste ja immer noch einen Block nehmen.

Aber dies ist noch kein Notfall.
Folgendes Statement
SQL-Code:
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
sollte dir helfen.

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 )
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)

Geändert von mkinzler (21. Okt 2010 um 21:33 Uhr) Grund: Code-Tag durch SQL-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

AW: Firebird - Rekursive SQL mit mehreren "Ebenen"

  Alt 24. Okt 2010, 20:20
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:
select o.id ordner_id, null artikel_id, o.ordnername
Wäre nett, wenn du mir diese Stellen nochmal erklären könntest.

Achja: Und was ist "besser": Die Sortierung durch SQL, durch die GUI oder ganz einfach egal?

Danke sehr.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Firebird - Rekursive SQL mit mehreren "Ebenen"

  Alt 24. Okt 2010, 20:26
Im Gegnteil es wird jeweils eine Null Wert durch diese Abfrage erzeugt.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Firebird - Rekursive SQL mit mehreren "Ebenen"

  Alt 24. Okt 2010, 20:56
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#6

AW: Firebird - Rekursive SQL mit mehreren "Ebenen"

  Alt 25. Okt 2010, 19:16
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
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Firebird - Rekursive SQL mit mehreren "Ebenen"

  Alt 26. Okt 2010, 08:57
Also zwecks "Verstehbarkeit" und "Erweiterbarkeit" würde ich 2 Statements empfehlen. Das Ganze mit einer CTE zu machen hätte nur Coolness-Gründe.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#8

AW: Firebird - Rekursive SQL mit mehreren "Ebenen"

  Alt 26. Okt 2010, 12:41
Also zwecks "Verstehbarkeit" und "Erweiterbarkeit" würde ich 2 Statements empfehlen. Das Ganze mit einer CTE zu machen hätte nur Coolness-Gründe.
Moin!

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!
  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 07:34 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