codememo

동등한 Postgre는 무엇입니까?Oracle의 CONNECT BY ... 시작 위치에 대한 SQL 구문?

tipmemo 2023. 6. 12. 21:31
반응형

동등한 Postgre는 무엇입니까?Oracle의 CONNECT BY ... 시작 위치에 대한 SQL 구문?

Oracle에서 다음과 같이 정의된 테이블이 있는 경우

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에서 이 작업은 어떻게 수행됩니까?

사용RECURSIVEPostgres의 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;

이전 답변의 자세한 내용 및 설명서 링크:

또는 추가 모듈을 설치할 수 있습니다.tablefunc거의 동일한 기능을 제공합니다.자세한 내용은 Stradas의 답변을 참조하십시오.

Postgres는 connect by와 동등합니다.모듈을 활성화해야 합니다.기본적으로 꺼져 있습니다.

그것은 테이블 펀이라고 불립니다.몇 가지 쿨한 크로스 탭 기능과 친숙한 "연결 기준" 및 "시작 기준"을 지원합니다.재귀적인 CTE보다 훨씬 더 웅변적이고 논리적으로 작동한다는 것을 알게 되었습니다.DBA가 이 기능을 사용할 수 없다면 Erwin의 방식을 따라야 합니다.
또한 "Bill of Materials" 유형 쿼리를 수행할 수 있을 정도로 강력합니다.

테이블 펑션은 다음 명령을 실행하여 켤 수 있습니다.

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" 확장자 아래는 해당 구조를 결합하는 것이 어떤 것이어야 하는지에 대한 설명입니다.많은 잠재력이 있기 때문에 저는 그것을 공정하게 하지 않겠습니다. 하지만 여기 아이디어를 제공하기 위해 약간의 힌트가 있습니다.

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

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;

예를 들어, 우리는 Postgre에 테이블이 있습니다.SQL의 이름은 product_types입니다.테이블 열은 (id, parent_id, name, sort_order)입니다.우리의 첫 번째 선택은 (부모) 루트 라인을 제공해야 합니다.id = 76은 SQL의 상위 1개 상위 레코드가 될 것입니다.

 with recursive product_types as (
     select
     pt0.id, 
     pt0.parant_id, 
     pt0.name,
     pt0.sort_order, 
     0 AS level
     from product_types pt0 
     where pt0.id = 76
    UNION ALL 
     select 
     pt1.id, 
     pt1.parant_id, 
     pt1.name, 
     pt1.sort_order, (product_types.level + 1) as level
     from product_types pt1 
     inner join product_types on (pt1.parant_id = product_types.id )
    )
    select 
    * 
    from product_types 
    order by level, sort_order 

언급URL : https://stackoverflow.com/questions/24898681/what-is-the-equivalent-postgresql-syntax-to-oracles-connect-by-start-with

반응형