2014-07-22 14 views
7

Trong Oracle, nếu tôi có một bảng định nghĩa là ...Cú pháp PostgreSQL tương đương với kết nối của Oracle là gì? BẮT ĐẦU VỚI?

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

Với những giá trị ...

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

cú pháp truy vấn này ...

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

sẽ mang lại ...

zero 
one 
four 
two 
five 
six 
three 

Việc này được thực hiện như thế nào trong PostgreSQL?

+3

Tôi nghĩ rằng bạn muốn sử dụng [VỚI đệ quy] (http://www.postgresql.org/docs/9.3/static/queries-with.html) –

+1

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

Trả lời

12

Sử dụng một RECURSIVE CTE trong Postgres:

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; 

Các chi tiết và liên kết đến các tài liệu trong câu trả lời trước đây của tôi:

5

Postgres không có một tương đương với kết nối bằng. Bạn sẽ cần bật mô-đun. Nó được tắt theo mặc định.

Được gọi là tablefunc. Nó hỗ trợ một số chức năng crosstab mát mẻ cũng như quen thuộc "kết nối bằng" và "Bắt đầu với". Tôi đã tìm thấy nó hoạt động nhiều hơn một cách hùng hồn và hợp lý hơn CTE đệ qui. Nếu bạn không thể có được điều này bởi DBA của bạn, bạn nên đi cho cách Erwin đang làm nó.
Cũng đủ mạnh để thực hiện truy vấn loại "hóa đơn nguyên liệu".

Tablefunc có thể được bật bằng cách chạy lệnh này:

CREATE EXTENSION tablefunc; 

Dưới đây là danh sách các lĩnh vực kết nối mới nâng lên từ các tài liệu chính thức.

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) 

Bạn thực sự nên xem trang tài liệu. Nó được viết tốt và nó sẽ cung cấp cho bạn các tùy chọn bạn đã quen. (Trên trang tài liệu, hãy cuộn xuống gần dưới cùng.)

Postgreql "Connect by" extension Dưới đây là mô tả về cấu trúc của cấu trúc đó. Có rất nhiều tiềm năng vì vậy tôi sẽ không làm điều đó công bằng, nhưng đây là một snip của nó để cung cấp cho bạn một ý tưởng.

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

Truy vấn thực sẽ trông như thế này. Connectby_tree là tên của bảng. Dòng bắt đầu bằng "AS" là cách bạn đặt tên cho các cột. Nó trông hơi lộn ngược.

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

Làm cách nào để bạn có thể thêm nhiều cột vào truy vấn?Giả sử, tôi cũng cần firstName, lastName. –

Các vấn đề liên quan