2014-07-22 25 views
7

W Oracle, jeśli mam tabeli zdefiniowanej jako ...Jaka jest odpowiednia składnia PostgreSQL do Oracle CONNECT BY ... START WITH?

CREATE TABLE taxonomy 
    (
    key NUMBER(11) NOT NULL CONSTRAINT taxPkey PRIMARY KEY, 
    value VARCHAR2(255), 
    taxHier NUMBER(11) 
    ); 
ALTER TABLE 
    taxonomy 
ADD CONSTRAINT 
    taxTaxFkey 
FOREIGN KEY 
    (taxHier) 
REFERENCES 
    tax(key); 

z tymi wartościami ...

key value taxHier 
0 zero null 
1 one  0 
2 two  0 
3 three 0 
4 four 1 
5 five 2 
6 six  2 

Ta składnia zapytań ...

SELECT 
    value 
FROM 
    taxonomy 
CONNECT BY 
    PRIOR key = taxHier 
START WITH 
    key = 0; 

przyniesie ...

zero 
one 
four 
two 
five 
six 
three 

Jak to zrobić w PostgreSQL?

+3

myślę, że chcesz używać [WITH rekurencyjnych] (http://www.postgresql.org/docs/9.3/static/queries-with.html) –

+1

http://stackoverflow.com/ q/22626394/330315 –

Odpowiedz

12

Użyj RECURSIVE CTE w PostgreSQL:

WITH RECURSIVE cte AS (
    SELECT key, value, 1 AS level 
    FROM taxonomy 
    WHERE key = 0 

    UNION ALL 
    SELECT t.key, t.value, c.level + 1 
    FROM cte  c 
    JOIN taxonomy t ON t.taxHier = c.key 
    ) 
SELECT value 
FROM cte 
ORDER BY level; 

Szczegóły oraz linki do dokumentacji w mojej poprzedniej odpowiedzi:

5

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); 
+0

Jak dodać więcej kolumn do zapytania?Powiedzmy, że potrzebuję również firstName, lastName. –