2014-07-22 83 views
7

Oracle, ben olarak tanımlanan bir tablo varsa ... Bu değerlerleOracle'ın CONNECT BY ... START WITH? Ile eşdeğer PostgreSQL sözdizimi nedir?

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

... yılında

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

Bu sorgu sözdizimi ...

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

... verim Will

zero 
one 
four 
two 
five 
six 
three 

Bu nasıl yapılır PostgreSQL?

+3

Sana [özyinelemeli İLE] kullanmak istediğiniz düşünüyorum (http://www.postgresql.org/docs/9.3/static/queries-with.html) –

+1

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

cevap

12

Kullanım Postgres bir RECURSIVE CTE:

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; 

Detaylar ve benim önceki yanıtta belgelere bağlantılar:

5

Postgres tarafından bağlamak için bir eşdeğer var. Modülü etkinleştirmeniz gerekecek. Varsayılan olarak kapalı.

tablefunc olarak adlandırılır. Bazı serin çapraz işlevselliği yanı sıra tanıdık " ile bağlayın" ve " ile Başlat" destekler. Bunu tekrarlayan CTE'den çok daha net ve mantıklı bir şekilde çalıştığını buldum. Bunu DBA'nız tarafından açamıyorsanız, Erwin'in yaptığı gibi gitmelisiniz.
"Malzeme listesi" türü sorgusunu da yapacak kadar sağlam.

Tablefunc bu komutu çalıştırarak açılabilir:

İşte
CREATE EXTENSION tablefunc; 

taze resmi belgelerinden kaldırdı bağlantı alanlarının listesi aşağıdadır.

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) 

Gerçekten de dokümanlar sayfasına bir göz atmalısınız. İyi yazılmış ve size alışkın olduğunuz seçenekleri verecektir. (Belge sayfasında aşağıya doğru, aşağıya doğrudur.)

Postgreql "Connect by" extension Aşağıda, bu yapının nasıl bir araya getirileceğinin açıklaması açıklanmıştır. Bir ton potansiyel var, bu yüzden bunu adalet yapmayacağım, ama işte size bir fikir vermek için bir ipucu.

connectby(text relname, text keyid_fld, text parent_keyid_fld 
      [, text orderby_fld ], text start_with, int max_depth 
      [, text branch_delim ]) 

Gerçek bir sorgu şöyle görünecektir. Connectby_tree, tablonun adıdır. "AS" ile başlayan satır, sütunları nasıl adlandırdığınızdır. Biraz baş aşağı görünüyor.

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

Sorguya nasıl daha fazla sütun ekleyebilirsin?Diyelim ki, ayrıca firstName, lastName'e ihtiyacım var. –

İlgili konular