rekursive Abfragen

Kampfgummibaerlie

Datenbank-Guru
Beiträge
734
Sodala, nachdem ich offenbar wieder einige Stunden in Langeweile finde, habe ich mich entschlossen, mich wieder Datenbanken zu witmen, und das erste, was mir so einfällt wären rekursive Abfragen.

Damit ein gewisser wissender Elefant hier eine nette Beschreibung bezüglich einer solchen Abfrage bauen kann:
Ich habe den Thread Stückliste zwar gesucht, und auh gefunden, fand aber die damalige Antwort nicht wirklich für mich befriedigend.

Könnte es hier jemand mit Beschreibungen zu den einzelnen oder auch Wortpaaren im Code erklären, und auch ein schlüssiges Beispiel mit, sagen wir mal, einer Backstube kreieren?

Beispiel, was mir gerade einfällt:
Ich möchte zB keine 3 Tabellen anlegen zwecks lösen des Problems.

In Tabelle 1 wäre das Mehl/Milch/etc.
in Tabelle 2 wäre dann der Teig/Biskoten
In Tabelle 3 wäre dann nur der Kuchen

Wäre spitze, wenn sich da jemand die Zeit nimmt, und mir auch noch rekursive Abfragen langsam aber sicher ins Langzeitgedächtnis einflüstert ;)
 
Werbung:
wie wäre es, mit LMGTFY anzufangen?

In Was ist neu in PostgreSQL 8.4? - PDF hast z.B. dieses Beispiel

Code:
SELECT feld, koerner_einzeln,
SUM(koerner_einzeln) OVER (ORDER BY feld)
AS koerner_summe
FROM (
WITH RECURSIVE reis AS
(SELECT 1 AS feld, 1::DECIMAL AS koerner_einzeln
UNION ALL
SELECT feld + 1, koerner_einzeln * 2
FROM reis
WHERE feld < 64)
SELECT *
FROM reis) AS rekursion;

für das Reiskörner-Schachbrett-Problem.
 
Mein Versuch Code mit Erklärung zu schreiben:

Code:
1 with recursive a(b)
2 as
3 (values (1)
4 union all
5 select b+1
6 from a
7 where b < 50)
8 select * from a;

In Zeile 1 erstellen wir eine recursive Tabelle.
In Zeile 2 sagen wir, dass jetzt der Inhalt der Tabelle kommt
In Zeile 3 sagen wir, dass der Wert 1 hineingeschrieben sein soll
In Zeile 4 verknüpfen wir diese eine Spalte aus der Tabelle mit "weiteren Spalten"
In Zeile 5 sagen wir, dass er aus der Spalte "b" 1 nehmen soll, und 1 dazuaddiert
In Zeile 6 sagen wir, dass er die Spalte "b" aus der rekursiven Tabelle "a" nehmen soll
In Zeile 7 beschränken wir die Ergebnisse
In Zeile 8 nehmen wir alle Spalten (wir haben nur eine) aus der Tabelle a, die wir in Zeile 1 erstellt haben

Ich sitze im Zug heim, würde mich freuen, auf eine Ausführung meiner Erklärung ^^
 
ja, in etwa. Zeile 4, da werden Zeilen verbunden, nicht Spalten.

ein anderes Beispiel:

Code:
with recursive schach(n, f) as (select 1,1::numeric union all select n+1, f*2 from schach where  n<=63) select * from schach;

liefert Dir die Anzahl der Reis- oder Weizenkörner auf einem Schachbrett, wenn mit 1 Korn begonnen und dann immer das doppelte im nächsten Feld ...
 
akutes Problem mit Abfrage, und ich komme nicht dahinter :'(

Folgender Code:
Code:
with recursive teilchen(ganzes_teil, teil, menge) as (
select ganzes_teil_name, teil_name, menge from teilchenliste
where ganzes_teil_name = 'Taufkleid'
union all
select teilchenliste.ganzes_teil_name, teilchenliste.teil_name, teilchenliste.menge*teilchen.menge
from teilchen, teilchenliste
where teilchen.ganzes_teil = teilchenliste.ganzes_teil_name
) select teil, sum(menge) from teilchen group by teil

Problem: Er lädt EWIG(also, mir zu lange)...

Wäre sehr dankbar über helfende Hinweise :)

Würde gerne bei Mimoso langsam so "Kleidungsproduktion" einleiten xD
(Ja, ich nutze meine Freizeit sinnvoll :S)
 
Werbung:
Ich verbreche es einmal wieder......
"Kopf -> Tisch"

Code:
with recursive a(b) as (
select ganzes_teil_name, teil_name, menge from teilchenliste
union
select ganzes_teil_name, teil_name, menge from teilchenliste
where ganzes_teil_name = teil_name
) select * from a where b = 'Taufkleid'

scheint in meinem Fall gut zu funktionieren, werde schauen, wies aussieht, mit mehreren Teilchen

Ich glaube, mein Problem war, weil ich nicht vom "Union All" loslassen wollte...

EDIT1: das where in der 2. Abfrage (nach Union) hinzugefügt. klappt jetzt besser :D
 
Zuletzt bearbeitet:
Zurück
Oben