database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40804 게시물 읽기
No. 40804
시작점, 끝점 좌표를 가지고 연결관계 파악하기
작성자
슈렉
작성일
2015-05-21 19:52ⓒ
2015-05-21 19:57ⓜ
조회수
8,344

혹시 가능한 방법이 있을까 하여 질문드립니다.

 

데이터베이스에 파이프의 시작점과 끝점 좌표가 있습니다.

3차원 좌표이므로, 컬럼은 아래와 같습니다.

pipe_id, part_id, start_x, start_y, start_z, end_x, end_y, end_z

 

연결된 하나의 파이프는 여러조각(part)으로 이루어졌습니다.

각 Part는 시작점 좌표와 끝점 좌표를 가지고 있습니다.

 

연결된 두 part를 생각해보면, 하나의 파트의 끝점은 연결된 다른 파트의 시작점과 일치할것입니다.

 

아래는 샘플 데이터 입니다.

 

pipe_id, part_id, start_x, start_y, start_z, end_x, end_y, end_z

----------------------------------------------------------------

pipe_001, part_001, 20094.0766, 12552.357, 119.075, 20094.0766, 12530.1568, 119.075

pipe_001, part_002, 20094.9516, 12561.9812, 123.575, 20133.137, 12561.9812, 123.575

pipe_001, part_003, 20094.0766, 12553.157, 122.775, 20094.0766, 12553.157, 119.875

pipe_001, part_004, 20094.0766, 12561.1062, 123.575, 20094.0766, 12553.957, 123.575

pipe_001, part_005, 20094.9516, 12529.2818, 119.075, 20095.0676, 12529.2818, 119.075

pipe_001, part_006, 20097.3768, 12529.2818, 117.575, 20114.877, 12529.2818, 117.5749

pipe_001, part_007, 20095.7583, 12529.2818, 118.7889, 20096.6861, 12529.2818, 117.8611

pipe_001, part_008, 20094.9516, 12561.9812, 123.575, 20094.0766, 12561.1062, 123.575

pipe_001, part_009, 20094.0766, 12553.957, 123.575, 20094.0766, 12553.157, 122.775

pipe_001, part_010, 20133.137, 12561.9812, 123.575, 20133.587, 12561.8312, 123.575

pipe_001, part_011, 20094.0766, 12530.1568, 119.075, 20094.9516, 12529.2818, 119.075

pipe_001, part_012, 20095.0676, 12529.2818, 119.075, 20095.7583, 12529.2818, 118.7889

pipe_001, part_013, 20096.6861, 12529.2818, 117.8611, 20097.3768, 12529.2818, 117.575

pipe_001, part_014, 20094.0766, 12553.157, 119.875, 20094.0766, 12552.357, 119.075

 

이러한 기준을 가지고 Query를 가지고 연결된 순서대로 나열할수 있을까요?

도와주세요!

 

 

 

이 글에 대한 댓글이 총 3건 있습니다.

WITH t(pipe_id, part_id, start_x, start_y, start_z, end_x, end_y, end_z) AS
(
SELECT 'pipe_001', 'part_001', 20094.0766, 12552.3570, 119.0750, 20094.0766, 12530.1568, 119.0750 FROM dual
UNION ALL SELECT 'pipe_001', 'part_002', 20094.9516, 12561.9812, 123.5750, 20133.1370, 12561.9812, 123.5750 FROM dual
UNION ALL SELECT 'pipe_001', 'part_003', 20094.0766, 12553.1570, 122.7750, 20094.0766, 12553.1570, 119.8750 FROM dual
UNION ALL SELECT 'pipe_001', 'part_004', 20094.0766, 12561.1062, 123.5750, 20094.0766, 12553.9570, 123.5750 FROM dual
UNION ALL SELECT 'pipe_001', 'part_005', 20094.9516, 12529.2818, 119.0750, 20095.0676, 12529.2818, 119.0750 FROM dual
UNION ALL SELECT 'pipe_001', 'part_006', 20097.3768, 12529.2818, 117.5750, 20114.8770, 12529.2818, 117.5749 FROM dual
UNION ALL SELECT 'pipe_001', 'part_007', 20095.7583, 12529.2818, 118.7889, 20096.6861, 12529.2818, 117.8611 FROM dual
UNION ALL SELECT 'pipe_001', 'part_008', 20094.9516, 12561.9812, 123.5750, 20094.0766, 12561.1062, 123.5750 FROM dual
UNION ALL SELECT 'pipe_001', 'part_009', 20094.0766, 12553.9570, 123.5750, 20094.0766, 12553.1570, 122.7750 FROM dual
UNION ALL SELECT 'pipe_001', 'part_010', 20133.1370, 12561.9812, 123.5750, 20133.5870, 12561.8312, 123.5750 FROM dual
UNION ALL SELECT 'pipe_001', 'part_011', 20094.0766, 12530.1568, 119.0750, 20094.9516, 12529.2818, 119.0750 FROM dual
UNION ALL SELECT 'pipe_001', 'part_012', 20095.0676, 12529.2818, 119.0750, 20095.7583, 12529.2818, 118.7889 FROM dual
UNION ALL SELECT 'pipe_001', 'part_013', 20096.6861, 12529.2818, 117.8611, 20097.3768, 12529.2818, 117.5750 FROM dual
UNION ALL SELECT 'pipe_001', 'part_014', 20094.0766, 12553.1570, 119.8750, 20094.0766, 12552.3570, 119.0750 FROM dual
)
SELECT a.*
     , LEVEL lv
     , SYS_CONNECT_BY_PATH(part_id, '-') p
  FROM t a
 START WITH NOT EXISTS (SELECT 1 FROM t
                         WHERE pipe_id = a.pipe_id
                           AND end_x = a.start_x
                           AND end_y = a.start_y
                           AND end_z = a.start_z
                        )
 CONNECT BY PRIOR pipe_id = pipe_id
   AND PRIOR end_x = start_x
   AND PRIOR end_y = start_y
   AND PRIOR end_z = start_z
;

마농(manon94)님이 2015-05-22 10:02에 작성한 댓글입니다.

마농님 감사합니다.

 

괜찮으시다면, 한가지만 더 여쭙겠습니다.

 

새롭게 레벨이 시작될때마다 하나의 그룹으로 묶어서 새로운 Part 그룹이름을 부여하고 싶습니다.

그리고, Level은 그룹내의 일련번호로 사용하면 좋겠습니다.

 

같은 트리에 있는것 끼리 그룹핑하여 이름을 부여하는 방법이 궁금합니다.

 

part_group, levlel

1, 1

1, 2

2, 1

2, 2

2, 3

2, 4

...

슈렉님이 2015-05-22 15:42에 작성한 댓글입니다. Edit

CONNECT_BY_ROOT로 해결했습니다.

 

도움주신 마농님께 감사드립니다.

 

SELECT a.*

, CONNECT_BY_ROOT part_group

,level part_seq

, SYS_CONNECT_BY_PATH(part_id, '-') p

슈렉님이 2015-05-22 16:34에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40807모든 테이블에 하나라도 없는 값은 테이블명 출력? [1]
궁금이
2015-05-27
7415
40806사용자로그 관리에 대해 여쭤봅니다. [2]
예진예랑
2015-05-26
7180
40805그룹 기준 횟수 카운트 문의 드립니다. [4]
김미림
2015-05-22
7831
40804시작점, 끝점 좌표를 가지고 연결관계 파악하기 [3]
슈렉
2015-05-21
8344
40803데이터 조합 출력 쿼리 부탁드립니다. [1]
황성균
2015-05-19
7943
40800오라클 쿼리 질문있습니다. [1]
박재형
2015-05-13
7500
40799윈도우 서버 2012에 오라클 9i 설치가 가능한가요?
염정훈
2015-05-13
8339
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.026초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다