복붙노트

[SQL] 오라클의 CONNECT BY ... START WITH에 해당하는 PostgreSQL의 구문은 무엇입니까?

SQL

오라클의 CONNECT BY ... START WITH에 해당하는 PostgreSQL의 구문은 무엇입니까?

오라클, 나는 테이블이 정의가 있다면 ...

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의에서 이루어집니다?

해결법

  1. ==============================

    1.포스트 그레스의 재귀 CTE를 사용합니다 :

    포스트 그레스의 재귀 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;
    

    내 이전 대답 설명서에 대한 정보 및 링크 :

  2. ==============================

    2.포스트 그레스에 의해 연결에 상응하는 가지고있다. 당신은 모듈을 활성화해야합니다. 그것은 기본적으로 해제되어 있습니다.

    포스트 그레스에 의해 연결에 상응하는 가지고있다. 당신은 모듈을 활성화해야합니다. 그것은 기본적으로 해제되어 있습니다.

    그것은 tablefunc이라고합니다. 그것은 멋진 크로스 탭 기능뿐만 아니라 익숙한 및 "시작과 함께", "로 연결"을 지원합니다. 나는 재귀 CTE보다 훨씬 더 설득력과 논리적으로 작동을 발견했다. 당신이 당신의 DBA으로 설정 얻을 수 없다면, 당신은 어윈이 그 일을하는 방법을 가야한다. 이 유형의 쿼리 "재료의 법안을"할뿐만 아니라하는 강력한 충분하다.

    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)
    

    당신은 정말 문서의 페이지를 참조해야한다. 그것은 잘 기록되고 그것은 당신에게 당신이 사용하는 옵션을 제공합니다. (doc 후 페이지 스크롤 아래에서의 아래쪽).

    확장 "에 의해 연결"Postgreql  다음은 같아야 함께 그 구조를 넣어 무엇에 대한 설명입니다. 이 내가 그것을 정의하지 않도록 잠재력의 톤이지만, 여기 당신에게 아이디어를 제공하기 위해 그것의 싹둑이다.

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

    실제 쿼리는 다음과 같이됩니다. Connectby_tree 테이블의 이름입니다. "있는 그대로"로 시작하는 행은 열 이름을하는 방법입니다. 그것은 조금 거꾸로 보이는 않습니다.

    SELECT * FROM connectby('connectby_tree', 'keyid', 'parent_keyid', 'pos', 'row2', 0, '~')
        AS t(keyid text, parent_keyid text, level int, branch text, pos int);
    
  3. ==============================

    3.Stradas에 의해 표시된 바와 같이 나는 쿼리를보고 :

    Stradas에 의해 표시된 바와 같이 나는 쿼리를보고 :

    SELECT value 
    FROM connectby('taxonomy', 'key', 'taxHier', '0', 0, '~') 
    AS t(keyid numeric, parent_keyid numeric, level int, branch text) 
    inner join taxonomy t on t.key = keyid;
    
  4. from https://stackoverflow.com/questions/24898681/what-is-the-equivalent-postgresql-syntax-to-oracles-connect-by-start-with by cc-by-sa and MIT license