동등한 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
'codememo' 카테고리의 다른 글
| AVAudioPlayer가 디버그 모드에서 중단점을 던집니다. (0) | 2023.06.12 |
|---|---|
| 고객이 WooCommerce를 사용하여 구매할 때 MailChimp 그룹에 고객 청구 정보를 추가하려면 어떻게 해야 합니까? (0) | 2023.06.12 |
| 루비로 무한을 표현하는 방법은? (0) | 2023.06.12 |
| R 데이터 프레임에서 NA 값을 0으로 바꾸려면 어떻게 해야 합니까? (0) | 2023.06.12 |
| PL/SQL 로깅 - 제어 방법 (0) | 2023.06.12 |