Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Rekursive SELECT Abfrage (https://www.delphipraxis.net/92224-sql-rekursive-select-abfrage.html)

TUX_der_Pinguin 16. Mai 2007 13:35

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

Fridolin 16. Mai 2007 13:54

Re: SQL Rekursive SELECT Abfrage
 
Hallo TUX,

vielleicht kann dir dieser Link weiterhelfen?!

Das 'Nested Sets' Modell - Bäume mit SQL

MFG

Fridolin

TUX_der_Pinguin 16. Mai 2007 14:28

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.

omata 16. Mai 2007 18:05

Re: SQL Rekursive SELECT Abfrage
 
Hallo TUX_der_Pinguin,

schau doch mal hier.

Gruss
Thorsten

daddy 16. Mai 2007 18:24

Re: SQL Rekursive SELECT Abfrage
 
Ich habe Deine Beispieltabellen in Firebird mal eingegeben und komme mit folgendem Select zum gewünschten Ergebnis:

Delphi-Quellcode:
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
Das Select setzt allerdings voraus, dass die Artikel nicht tiefer als auf 3 Ebenen verschachtelt sind.

Gruß Daddy

mkinzler 16. Mai 2007 18:27

Re: SQL Rekursive SELECT Abfrage
 
Ich würde das Problem durch eine rekursive SP lösen.

shmia 16. Mai 2007 18:38

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

alzaimar 17. Mai 2007 07:50

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.

mkinzler 17. Mai 2007 09:25

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.

TUX_der_Pinguin 21. Mai 2007 14:11

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:43 Uhr.
Seite 1 von 2  1 2      

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