AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Rekursive SELECT Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Rekursive SELECT Abfrage

Ein Thema von TUX_der_Pinguin · begonnen am 16. Mai 2007 · letzter Beitrag vom 22. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#1

SQL Rekursive SELECT Abfrage

  Alt 16. Mai 2007, 13:35
Datenbank: MySQL • Version: 5 • Zugriff über: dbExpress
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
  Mit Zitat antworten Zitat
Fridolin

Registriert seit: 8. Jan 2007
71 Beiträge
 
Delphi 2006 Architect
 
#2

Re: SQL Rekursive SELECT Abfrage

  Alt 16. Mai 2007, 13:54
Hallo TUX,

vielleicht kann dir dieser Link weiterhelfen?!

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

MFG

Fridolin
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: SQL Rekursive SELECT Abfrage

  Alt 16. Mai 2007, 14:28
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.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: SQL Rekursive SELECT Abfrage

  Alt 16. Mai 2007, 18:05
Hallo TUX_der_Pinguin,

schau doch mal hier.

Gruss
Thorsten
  Mit Zitat antworten Zitat
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
124 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: SQL Rekursive SELECT Abfrage

  Alt 16. Mai 2007, 18:24
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: SQL Rekursive SELECT Abfrage

  Alt 16. Mai 2007, 18:27
Ich würde das Problem durch eine rekursive SP lösen.
Markus Kinzler
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: SQL Rekursive SELECT Abfrage

  Alt 16. Mai 2007, 18:38
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
Andreas
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: SQL Rekursive SELECT Abfrage

  Alt 17. Mai 2007, 07:50
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: SQL Rekursive SELECT Abfrage

  Alt 17. Mai 2007, 09:25
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.
Markus Kinzler
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: SQL Rekursive SELECT Abfrage

  Alt 21. Mai 2007, 14:11
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:06 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