AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken [SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen
Thema durchsuchen
Ansicht
Themen-Optionen

[SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

Ein Thema von Medium · begonnen am 3. Nov 2010 · letzter Beitrag vom 3. Nov 2010
Antwort Antwort
Seite 1 von 2  1 2      
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#1

[SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

  Alt 3. Nov 2010, 16:31
Datenbank: MySQL • Version: 5.1.11 • Zugriff über: UniDAC
Ahoi!

Ich habe hier eine Tabelle der Struktur (ID, Text, ParentID).

Ich möchte jetzt gerne in einem Select ein Feld zusammen setzen, dass alle "Text" hintereinander enthält bis ein ParentID=NULL erreicht ist, und zwar beginnend mit dem letzten Parent. Folgende hypothetische Tabelle:
Code:
ID  Text    ParentID
----------------------------
0   "Hallo" NULL
1   "Satz"  2
2   "ein"   4
3   "ich"   0
4   "bin"   3
Dann brauche ich in meiner Ergebnismenge einen Datensatz
Code:
ID  Text
-----------------------------
1   "Hallo ich bin ein Satz"
Die Ergebnismenge besteht dabei jedoch nicht nur aus einem einzelnen Datensatz, sondern derer Kaskaden können in der Basistabelle mehrfach sein, und auch unterschiedlich tief.
Es gibt mehr Felder als nur diese drei, und die anderen Felder sollen die Werte des gerade aufgelösten Datensatzes beibehalten. Es soll zudem jeder Datensatz aufgelöst werden. Beispiel:


Code:
ID  Text          ParentID  Info
-----------------------------------------
0   "Firma A"     NULL      "foo"
1   "Firma B"     NULL      "bar"
2   "Abteilung X" 0         "xxx"
3   "Werk 1"      1         "werk"
4   "Abteilung Y" 3         "yyy"
|
|
v
Code:
ID  Text                         Info
-------------------------------------------
0   "Firma A"                    "foo"
1   "Firma B"                    "bar"
2   "Firma A Abteilung X"        "xxx"
3   "Firma B Werk 1"             "werk"
4   "Firma B Werk 1 Abteilung Y" "yyy"

Wie kann ich dieses beim selecten mit SQL am besten erreichen?

Besten Dank im Voraus,
Medium
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: [SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

  Alt 3. Nov 2010, 17:05
Die Ergebnismenge besteht dabei jedoch nicht nur aus einem einzelnen Datensatz, sondern derer Kaskaden können in der Basistabelle mehrfach sein, und auch unterschiedlich tief.
Es gibt mehr Felder als nur diese drei, und die anderen Felder sollen die Werte des gerade aufgelösten Datensatzes beibehalten. Es soll zudem jeder Datensatz aufgelöst werden.
Kannst du eine maximale Tiefe angeben? Imho ist es sonst nicht ohne weiteres in SQL formulieren. Wenn ja, kannst du die Tabelle n mal mit sich selbst joinen und dadurch bis zu n Felder verketten.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: [SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

  Alt 3. Nov 2010, 18:14
in Oracle hilft Dir CONNECT BY weiter, aber ich weiß nicht ob MySQL das auch kann.
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: [SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

  Alt 3. Nov 2010, 19:37
CONNECT BY habe ich in der MySQL Referenz leider nicht gefunden (wäre ja perfekt), aber ich glaube die Tiefe eingrenzen zu können. Den JOIN hatte ich auch im Sinn, war nur aus mir gerade nicht weiter bekannten Gründen der Auffassung, dass man eine Tabelle nicht mit sich selbst joinen konnte . Ich probier das mal. Merci!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: [SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

  Alt 3. Nov 2010, 19:39
Warum sollte man eine Tabelle nicht mit sich selber Joinen können?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: [SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

  Alt 3. Nov 2010, 19:42
Gibt es im MySQL temporäre Tabellen und Proceduren die diese als Result, sowie einfache Schleifenkonstrukte ("While") zurückliefern können?
Unter MS-SQLServer habe ich ähnliches auf die Art lösen können.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: [SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

  Alt 3. Nov 2010, 19:44
Oder einer rekursiven SP
Markus Kinzler
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#8

AW: [SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

  Alt 3. Nov 2010, 19:51
Der JOIN klappt, allerdings werden leider auch nur die Sätze zurückgeliefert, die die entsprechende Tiefe aufweisen
Sind rekursive SPs in MySQL überhaupt wieder möglich? Mein letzter Stad war, dass dies aus technischen Gründen mal entfernt wurde. Edit: Okay, gibt's, ist aber off-by-default. Bummi, was du genau sagen willst, versteh ich gerade nicht so recht
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 3. Nov 2010 um 19:56 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: [SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

  Alt 3. Nov 2010, 19:53
In MySQL kenne ich mich nicht so aus ( lange her) bei FB geht das, der kennt baer auch rekursive CTE
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: [SQL] Kaskadierende Eltern-Kind Beziehung in selber Tabelle auflösen

  Alt 3. Nov 2010, 20:11
etwas in der Art
SQL-Code:
Select Cast(ID as Int) as ID, Parent, Cast([text] as Varchar(4000)) as text
into #tmp
from tree --where Parent is NULL


While Exists(Select * from #tmp join tree on tree.Parent=#tmp.ID)
Update #tmp set text = #tmp.text +' '+ tree.Text ,#tmp.ID=tree.id
from tree
where tree.Parent=#tmp.ID


Select * from #tmp
Drop table #tmp
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von mkinzler ( 3. Nov 2010 um 20:15 Uhr) Grund: Code-Tag durch SQL-Tag ersetzt
  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 08:46 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