![]() |
Datenbank: MySQL • Version: 5 • Zugriff über: dbExpress
SQL Rekursive SELECT Abfrage
Hallo,
ich wollte mal fragen ob und wie es möglich ist eine rekursive SELECT Abfrage zuerstellen. Um etwas Klarheit zuschaffen was ich vorhabe versuche ich dies durch ein Beispiel anschaulicher zumachen. Tabelle Artikel ID, Name 0, Rot 1, Grün 2, Blau 3, Gelb 4, Schwarz 5, Farben 6, Papier 7, Rollen 8, Lager 9, Tapeten ... Tabelle Gruppen ID, Gruppe, Artikel 0, 8, 5 1, 8, 9 2, 5, 0 3, 5, 1 4, 5, 2 5, 5, 3 6, 9, 6 7, 9, 7 ... Das Ergebnis sieht dann wie folgt aus Lager ->Farben ---->Rot ---->Grün ---->Blau ---->Gelb ->Tapeten ---->Papier ---->Rollen Jetzt gehe ich hin und rufe in Delphi eine Prozedur rekursiv auf die eine MySQL Abfrage aufruft, "SELECT Artikel.Name FROM Artikel LEFT JOIN Gruppen ON Artikel.ID=Gruppen.Artikel WHERE Gruppen.Gruppe=GruppenID" Nur kommt jetzt meine Frage kann ich das nicht gleich auf alles auf dem SQL Server machen, dachte da an Store Procedure (Gespeicherte Prozeduren) jedoch habe ich davon leider keinen Plan und auch nich nicht sonderlich viel an Dokus gefunden anhand derer man das lernen könnte. mfg TUX |
Re: SQL Rekursive SELECT Abfrage
Hallo TUX,
vielleicht kann dir dieser Link weiterhelfen?! ![]() MFG Fridolin |
Re: SQL Rekursive SELECT Abfrage
Fridolin, das ist ein sehr interessanter Ansatz, nur in meinem Fall kann eine Unterliste mehrfach vorkommen.
Das würde dann mit "Nested Sets" problematisch, dann müßte man die Listen doppelt speichern das würde dann Probleme bei der bearbeitung geben also auch nicht ganz sinnvoll. Beisp. Lager ->Farben --->Rot --->Grün --->Blau --->Gelb ->Tapeten --->Papier --->Rollen --->Farben ----->Rot ----->Grün ----->Blau ----->Gelb Hauptsächlich würde ich gern mehr über Store Procedures erfahren, könnte das für mehrere Zwecke gebrauchen komplexere Abfragen in form einer Prozedure auf dem Server zu realisieren. |
Re: SQL Rekursive SELECT Abfrage
|
Re: SQL Rekursive SELECT Abfrage
Ich habe Deine Beispieltabellen in Firebird mal eingegeben und komme mit folgendem Select zum gewünschten Ergebnis:
Delphi-Quellcode:
Das Select setzt allerdings voraus, dass die Artikel nicht tiefer als auf 3 Ebenen verschachtelt sind.
Select A1.Name, A2.Name, A3.Name
from Gruppen G1 left join Artikel A1 on G1.Gruppe = A1.ID left join Artikel A2 on G1.Artikel = A2.ID left join Gruppen G2 on G1.Artikel = G2.Gruppe left join Artikel A3 on G2.Artikel = A3.ID where A3.Name is not NULL Gruß Daddy |
Re: SQL Rekursive SELECT Abfrage
Ich würde das Problem durch eine rekursive SP lösen.
|
Re: SQL Rekursive SELECT Abfrage
Ich denke, du brauchst 3 Tabellen:
Artikel Gruppen ArtGruppen Ein Artikel kann in mehreren Gruppen enthalten sein und eine Gruppe kann mehrere Artikel enthalten. Also liegt eine N:M Verknüpfung vor, die man über eine Hilfstabelle (hier ArtGruppen genannt) auflösen muss. Die Tabelle ArtGruppen enthält die Primärschlüsselfelder von Artikel und Gruppen. Bei den Gruppen liegt ein hierachischer Selbstbezug vor. Ein Gruppen kann mehrere Untergruppen haben. Dies wird Datenbanktechnisch über ein Parentfeld abgebildet:
Code:
ID | Name | Parent
1 | Lager | NULL 2 | Farben | 1 3 | Tapeten | 1 Vielleicht sollte man den Artikeln auch zusätzliche Attribute vergeben. Ein Attribut könnte z.B. die Farbe oder das Material (Papier oder Folie) sein. Die Attribute werden dann in einer zusätzlichen Tabelle gespeichert:
Code:
Tabelle AtikelAttributs
========================= IdArtikel | IdAttribut| AttributValue 5 | 3 | grün 5 | 12| Papier |
Re: SQL Rekursive SELECT Abfrage
Rekursive Stored Procedures sind immer heikel, da z.B. der MSSQL-Server eine Sperre eingebaut hat. sonst würde sich der Server aufhängen.
Man benötigt auch keine rekursive Routine, um so eine Baumstruktur zu erstellen. Wenn dein Baum aber mal 1000000 Elemente enhält, dann blockierst Du den Server unnötig. Mach es doch so: Ließ zunächst nur die Elemente der 1.Ebene ein und stelle sie in einer Treeview dar. Jeder Baumknoten bekommt ein 'Dummy'-Child Eintrag, damit das [+] sichtbar ist. Klickt der Anwender nun auf ein [+], dann prüfst Du, ob der Dummy-Eintrag noch vorhanden ist. Wenn ja, dann löschst Du ihn, liest die Kinder dieses Knotens ein, hängst sie unter den angeklickten Knoten und fertig. |
Re: SQL Rekursive SELECT Abfrage
Die Gefahr der der Erzeugung einer Schleife durch falsches Verlinken besteht natürlich immer, auch wenn man es nicht über eine SP löst. Dann hat es aber der Vorteil, daß nur das lokale Programm hängt.
Ich löse solche Probleme halt gern durch Rekursion, ist aber eine Geschmackssache. |
Re: SQL Rekursive SELECT Abfrage
Hallo,
vielen dank für die zahlreichen tipps, ich habe das jetzt mit Stored Procedures probiert und alles scheint zu klappen habe mir das Posting welches omata gepostet hat angesehen und das für meine Zwecke umgeschrieben. Jetzt muß ich das ganze nur noch in meinem Projekt aufnehmen und das wars. Nicht ganz so leicht wie ich dachte, ich habe irgendwie noch nicht so den Ansatz gefunden wie ich die gespeicherte Prozedur überhaupt abgerufen bekomme via dbExpress. mfg TUX |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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