🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.datenbanken.misc
2 messages
2 total messages Started by Harald Wenninger Thu, 11 Dec 2014 10:56
Spass mit iterativen Queries (WITH RECURSIVE)
#36344
Author: Harald Wenninger
Date: Thu, 11 Dec 2014 10:56
55 lines
1413 bytes
Hallo zusammen,

ich stehe vor folgendem Problem, das DBMS ist Postgres 9.3:
Gegeben sei folgende Tabelle mit einer baumartigen Abteilungsstruktur:

CREATE TABLE abteilungen (
	id     integer PRIMARY KEY,
	name   text    NOT NULL,
	parent integer REFERENCES abteilungen(id)
);

gefüllt mit den Daten:

 id |      name      | parent
-----------------------------
  1 | Abteilung      |
  2 | Unterabteilung | 1
  3 | Subabteilung   | 2

Ich möchte nun den vollen Namen von Abteilungen haben, also mit den
übergeordneten Abteilungen, also eine Query mit folgendem Ergebnis:

 id |                  name
--------------------------------------------
  1 | Abteilung
  2 | Abteilung/Unterabteilung
  3 | Abteilung/Unterabteilung/Subabteilung


Mit folgender Query

WITH RECURSIVE abteilungsname(id, name, next) AS (
	SELECT id, name, parent FROM abteilungen
	UNION
	SELECT b.id, CONCAT(a.name, '/', b.name), a.parent
	FROM abteilungsname b
	     JOIN abteilungen a ON b.next=a.id
)
SELECT id, name FROM abteilungsname;

wird aber (logischerweise) zu viel ausgegeben:

 id |                  name
--------------------------------------------
  1 | Abteilung
  2 | Unterabteilung
  2 | Abteilung/Unterabteilung
  3 | Subabteilung
  3 | Unterabteilung/Subabteilung
  3 | Abteilung/Unterabteilung/Subabteilung

Wie werde ich die "überflüssigen" Zeilen los?
Da fehlt mir noch die richtig zündende Idee.

Gruß,
Harald
Re: Spass mit iterativen Queries (WITH RECURSIVE)
#36345
Author: Harald Wenninger
Date: Thu, 11 Dec 2014 11:56
42 lines
1143 bytes
* Harald Wenninger tat kund und zu wissen:

> Mit folgender Query

> WITH RECURSIVE abteilungsname(id, name, next) AS (
> 	SELECT id, name, parent FROM abteilungen
> 	UNION
> 	SELECT b.id, CONCAT(a.name, '/', b.name), a.parent
> 	FROM abteilungsname b
> 	     JOIN abteilungen a ON b.next=a.id
>)
> SELECT id, name FROM abteilungsname;

> wird aber (logischerweise) zu viel ausgegeben:

>  id |                  name
> --------------------------------------------
>   1 | Abteilung
>   2 | Unterabteilung
>   2 | Abteilung/Unterabteilung
>   3 | Subabteilung
>   3 | Unterabteilung/Subabteilung
>   3 | Abteilung/Unterabteilung/Subabteilung

> Wie werde ich die "überflüssigen" Zeilen los?
> Da fehlt mir noch die richtig zündende Idee.

Kaum denkt man nicht mehr mit Gewalt daran, fällt einem die Lösung auch
so ein:

WITH RECURSIVE abteilungsname(id, name, next) AS (
	SELECT id, name, parent FROM abteilungen
	UNION
	SELECT b.id, CONCAT(a.name, '/', b.name), a.parent
	FROM abteilungsname b
	     JOIN abteilungen a ON b.next=a.id
)
SELECT id, name FROM abteilungsname WHERE next IS NULL;

tut genau das, was es soll ...

Gruß,
Harald
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads