에서 그들의 조상과 일치하는 행을 반환하는 나는 (등 부서와) 나무와 같은 조직 단위 구조의 테이블 오라클 12C 데이터베이스가 : 그래서SQL 쿼리 트리 구조
CREATE TABLE "OUS" (
"ID" NUMBER(38,0) NOT NULL ENABLE,
"NAME" VARCHAR2(255 CHAR) NOT NULL ENABLE,
"PARENT_ID" NUMBER(38,0),
PRIMARY KEY("ID"),
CONSTRAINT "OUS_HIERARCHY_FK" FOREIGN KEY ("PARENT_ID") REFERENCES "OUS" ("ID") ON DELETE CASCADE
);
을,
| id | name | parent_id |
| -: | ------------- | --------: |
| 1 | Root | (NULL) |
| 2 | Territorial 1 | 1 |
| 3 | Regional 1-1 | 2 |
| 4 | Alpha dept | 3 |
| 5 | Beta dept | 3 |
| 6 | Regional 1-2 | 2 |
| 7 | Gamma dept | 6 |
| 8 | Delta dept | 7 |
| 9 | Territorial 2 | 1 |
| 10 | Regional 2-1 | 9 |
| 11 | Epsilon dept | 10 |
| 12 | Zeta dept | 10 |
같은 갖는 구조는 당신이 그것을 만들 수 있습니다 SQL과 같은 :
INSERT INTO ous (id, name, parent_id) VALUES (13, 'Root', NULL);
INSERT INTO ous (id, name, parent_id) VALUES ( 2, 'Territorial 1', 13);
INSERT INTO ous (id, name, parent_id) VALUES ( 1, 'Regional 1-1', 2);
INSERT INTO ous (id, name, parent_id) VALUES ( 5, 'Alpha dept', 1);
INSERT INTO ous (id, name, parent_id) VALUES ( 4, 'Beta dept', 1);
INSERT INTO ous (id, name, parent_id) VALUES ( 6, 'Regional 1-2', 2);
INSERT INTO ous (id, name, parent_id) VALUES ( 7, 'Gamma dept', 6);
INSERT INTO ous (id, name, parent_id) VALUES ( 8, 'Delta dept', 6);
INSERT INTO ous (id, name, parent_id) VALUES ( 9, 'Territorial 2', 13);
INSERT INTO ous (id, name, parent_id) VALUES ( 3, 'Regional 2-1', 9);
INSERT INTO ous (id, name, parent_id) VALUES (15, 'Epsilon dept', 3);
INSERT INTO ous (id, name, parent_id) VALUES (12, 'Zeta dept', 3);
주어진 조건 (예 : name = 'Alpha' OR name = 'Epsilon
)과 일치하는 일부 OU를 찾고 해당 OU 및 해당 조상의 하위 트리를 가져와야합니다. 예를 들어
:
| id | name | parent_id |
| -: | ------------- | --------: |
| 1 | Root | (NULL) | ← Ancestor of Alpha and Epsilon
| 2 | Territorial 1 | 1 | ← Ancestor of Alpha
| 3 | Regional 1-1 | 2 | ← Ancestor of Alpha
| 4 | Alpha dept | 3 | ← Matches the WHERE clause!
| 9 | Territorial 2 | 1 | ← Ancestor of Epsilon
| 10 | Regional 2-1 | 9 | ← Ancestor of Epsilon
| 11 | Epsilon dept | 10 | ← Matches the WHERE clause!
나는 다양한 Hierarchical and recursive queries in SQL 보았다 해요 : Oracle Hierarchical queries 및 CTEs하지만 나에게 그런 결과를 반환 할 수있는 쿼리를 알아낼 수 없습니다.
Oracle Database 12c를 사용하고 있습니다.
내가 좋아하는 쿼리를 시도했다 :
SELECT ous.* FROM ous
WHERE name = 'Alpha' OR name = 'Epsilon'
START WITH
parent_id IS NULL
CONNECT BY
PRIOR id = parent_id
ORDER SIBLINGS BY name;
을하지만 모든 행에 적용되는 경우 (그래서 조상이 필터링되는) 0 행 또한 내가 해봤
반환
을WITH RECURSIVE all_nodes (id, parent_id, name) AS (
SELECT ous.id, ous.parent_id, name FROM ous WHERE (name = 'Alpha' OR name = 'Epsilon')
UNION
SELECT ous.id, ous.parent_id, name FROM ous INNER JOIN all_nodes ON ous.parent_id = all_nodes.id
)
SELECT * FROM all_nodes INNER JOIN ous ON all_nodes.id = ous.id ORDER BY name;
그러나 그것은 오류를 반환 SQL Error [905] [42000]: ORA-00905: keyword is missing
신속한 답장을 보내 주셔서 감사합니다. 불행히도 쿼리는 조상이없는 일치하는 행만 반환합니다. 또한 오라클은 재귀 CTE가 별칭 목록 (ORA-32039)을 가져야하므로 첫 번째 행을'(name, id, parent_id)로 (')로 변경했다고 말합니다. – Envek
알아 냈어 :'ON' 절의 평등은'on ous.id = t.parent_id'와 반대가되어야합니다. 이제 작동합니다! – Envek
Oracle 구문에서 'ORDER SIBLINGS BY'와 같이 부모에서 자식으로 성장하지 않는 ID가있는 경우 계층 구조 및 이름별로 결과를 정렬 할 수 있습니까? – Envek