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)
Author: Harald Wenninger
Date: Thu, 11 Dec 2014 10:56
Date: Thu, 11 Dec 2014 10:56
55 lines
1413 bytes
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)
Author: Harald Wenninger
Date: Thu, 11 Dec 2014 11:56
Date: Thu, 11 Dec 2014 11:56
42 lines
1143 bytes
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