Postgres ma odpowiednika do łączenia przez. Musisz włączyć moduł. Domyślnie jest wyłączone.
Nazywa się tablefunc. Obsługuje kilka ciekawych funkcji krzyżowych, a także znane "połączyć przez" i "Rozpoczęcie z". Odkryłem, że działa on znacznie bardziej elokwentnie i logicznie niż rekurencyjny CTE. Jeśli nie możesz włączyć tego przez DBA, powinieneś wybrać sposób, w jaki Erwin to robi.
Jest wystarczająco solidny, aby wykonać zapytanie typu "zestawienie materiałów".
Tablefunc można włączyć, uruchamiając komendę:
CREATE EXTENSION tablefunc;
Oto lista pól przyłączeniowych świeżo zniesione z oficjalnej dokumentacji.
Parameter: Description
relname: Name of the source relation (table)
keyid_fld: Name of the key field
parent_keyid_fld: Name of the parent-key field
orderby_fld: Name of the field to order siblings by (optional)
start_with: Key value of the row to start at
max_depth: Maximum depth to descend to, or zero for unlimited depth
branch_delim: String to separate keys with in branch output (optional)
Naprawdę powinieneś rzucić okiem na stronę dokumentów. Jest dobrze napisany i da ci opcje, do których przywykłeś. (Na stronie dokumentu przewiń w dół, jego spód znajduje się u dołu).
Postgreql "Connect by" extension Poniżej znajduje się opis tego, jak układać tę strukturę razem. Jest mnóstwo potencjału, więc nie zrobię tego sprawiedliwie, ale tutaj jest to drobiazg, żeby dać ci pomysł.
connectby(text relname, text keyid_fld, text parent_keyid_fld
[, text orderby_fld ], text start_with, int max_depth
[, text branch_delim ])
Prawdziwe zapytanie będzie wyglądało tak. Connectby_tree jest nazwą tabeli. Linia, która zaczyna się od "AS", to sposób nazywania kolumn. Wygląda to trochę do góry nogami.
SELECT * FROM connectby('connectby_tree', 'keyid', 'parent_keyid', 'pos', 'row2', 0, '~')
AS t(keyid text, parent_keyid text, level int, branch text, pos int);
myślę, że chcesz używać [WITH rekurencyjnych] (http://www.postgresql.org/docs/9.3/static/queries-with.html) –
http://stackoverflow.com/ q/22626394/330315 –