2014-07-22 3 views
7

में ओरेकल, अगर मैं एक तालिका के रूप में परिभाषित किया गया है ...ओरेकल के कनेक्ट के बराबर पोस्टग्रेएसक्यूएल सिंटैक्स क्या है ... के साथ शुरू करें?

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); 
इन मूल्यों के साथ

...

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

इस क्वेरी सिंटैक्स ...

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

निकलेगा ...

zero 
one 
four 
two 
five 
six 
three 

यह PostgreSQL में कैसे किया जाता है?

+3

मुझे लगता है कि आप [पुनरावर्ती के साथ] का उपयोग करना चाहते हैं (http://www.postgresql.org/docs/9.3/static/queries-with.html) –

+1

http://stackoverflow.com/ क्यू/22626394/330315 –

उत्तर

12

उपयोग Postgres में एक 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; 

विवरण और मेरे पिछले जवाब में प्रलेखन के लिए लिंक:

5

Postgres द्वारा कनेक्ट करने के लिए एक समान है। आपको मॉड्यूल को सक्षम करने की आवश्यकता होगी। यह डिफ़ॉल्ट रूप से बंद हो गया।

इसे tablefunc कहा जाता है। यह कुछ ठंडा क्रॉसस्टैब कार्यक्षमता के साथ-साथ परिचित " से कनेक्ट" और " से प्रारंभ करें" का समर्थन करता है। मैंने पाया है कि यह रिकर्सिव सीटीई की तुलना में अधिक स्पष्ट रूप से और तार्किक रूप से काम करता है। यदि आप इसे अपने डीबीए द्वारा चालू नहीं कर पा रहे हैं, तो आपको इरविन इसे करने के तरीके के लिए जाना चाहिए।
यह "सामग्री के बिल" प्रकार की क्वेरी करने के लिए पर्याप्त मजबूत है।

Tablefunc इस आदेश चलाकर पर दिया जा सकता है:

CREATE EXTENSION tablefunc; 

यहां कनेक्शन क्षेत्रों ताजा आधिकारिक दस्तावेज से उठाया की सूची है।

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) 

आपको वास्तव में दस्तावेज़ पृष्ठ पर एक नज़र रखना चाहिए। यह अच्छी तरह लिखा गया है और यह आपको उन विकल्पों को देगा जो आप उपयोग करते हैं। (दस्तावेज़ पृष्ठ पर नीचे स्क्रॉल करें, इसके नीचे।)

Postgreql "Connect by" extension नीचे यह संरचना एक साथ रखकर क्या होनी चाहिए इसका वर्णन नीचे दिया गया है। संभावित रूप से एक टन है इसलिए मैं इसे न्याय नहीं करूँगा, लेकिन यहां आपको एक विचार देने के लिए इसका एक स्निप है।

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

एक असली क्वेरी इस तरह दिखेगी। Connectby_tree तालिका का नाम है। "AS" से शुरू होने वाली रेखा यह है कि आप कॉलम का नाम कैसे देते हैं। यह थोड़ा उल्टा दिखता है।

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

आप क्वेरी में और कॉलम कैसे जोड़ सकते हैं?मान लीजिए, मुझे पहले नाम, अंतिम नाम की भी आवश्यकता है। –

संबंधित मुद्दे