[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.포스트 그레스의 재귀 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.포스트 그레스에 의해 연결에 상응하는 가지고있다. 당신은 모듈을 활성화해야합니다. 그것은 기본적으로 해제되어 있습니다.
포스트 그레스에 의해 연결에 상응하는 가지고있다. 당신은 모듈을 활성화해야합니다. 그것은 기본적으로 해제되어 있습니다.
그것은 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.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;
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
'SQL' 카테고리의 다른 글
[SQL] 엔티티 프레임 워크 마이그레이션에 'GO'문을 추가 (0) | 2020.05.26 |
---|---|
[SQL] sqlite가에서 DATETIME에서 달을 받기 (0) | 2020.05.26 |
[SQL] ERROR : 인덱스 식의 기능은 포스트 그레스 불변 표시해야 (0) | 2020.05.26 |
[SQL] MySQL의 서브 쿼리 반환 둘 이상의 행 (0) | 2020.05.25 |
[SQL] SQL Server의 UNIX_TIMESTAMP (0) | 2020.05.25 |