계층쿼리... 이런경우 어떻게 하나요. 0 18 1,781

by 열심히 [SQL Query] [2014.04.07 22:46:25]



...

by 마농 [2014.04.08 09:12:16]
질문이 어지럽네요.
데이터도 중복이 많구요.(전체 58건인데 Distinct 해보면 40건이네요)
중복이 없는 깔끔한 원본자료와 원하는 결과자료를 표형태로 정리해 보세요.

by 손님 [2014.04.08 11:10:51]
정리해서 저녁에 올리겠습니다.
지금 어느정도 짰는데...
이거 하나만 봐주시겠습니까.. 부모코드
끼워넣을수있는지....

tmp 테이블에 이렇게 데이터가있고
1 a000 0000 20140101
2 a101 a000 20140101
2 a102 a000 20140101
3 a201 a102 20140102
.
.
생략

간단한 예로 날짜조건에 20140102
가 입력되어
출력결과가 a201 가 나오게되눈데요.
이런경우 자기 바로 위 부모의 a102 가
나오게 할수있는 방법 이 있을까요?

by 마농 [2014.04.08 11:24:37]
하위가 조건에 맞으면 상위도 나오게 하는 방법
1.조건을 만족하는 자료를 시작점으로 : Start With dt = '20140102'
2. 계층구조를 역으로 전개하고 : Connect By PRIOR pcd = cd
3. 나온 결과를 중복 제거하고 인라인뷰로 : From (Select Distinct cd, pcd ...)
4. 최상위를 시작으로 순방향 전개 : Start With pcd IS NULL Connect By Prior cd = pcd

by 손님 [2014.04.08 14:19:06]
제가 하나빠트렸네요...
1 a000 0000 20140101
2 a101 a000 20140101
2 a102 a000 20140101
3 a201 a102 20140102
3 a202 a102 20140103


일자조건은 from to 로 20140102 부터
20140103 에해당하는 데이터가출력됩니다.
잘못예시들어서 죄송합니다.

결과
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
2 a102 a000
3 a201 a102 20140102
3 a202 a102 20140103

by 농부지기 [2014.04.08 11:22:38]
마지막 질문도 너무 간단하네요.
질문에 대한 답변을 아래에 작성해 봤는데요.
느낌이 아래작성한 SQL 문장은 간단한데.. 이정도는 아실거 같구요.
질문을 다시한번 자세히 하셔야 할거 같네요.

WITH T (SEQ, C_CODE, P_CODE, DT) AS ( SELECT '1', 'a000', '0000', '20140101' FROM DUAL UNION ALL SELECT '2', 'a101', 'a000', '20140101' FROM DUAL UNION ALL SELECT '2', 'a102', 'a000', '20140101' FROM DUAL UNION ALL SELECT '3', 'a201', 'a102', '20140102' FROM DUAL ) SELECT * FROM T START WITH DT = '20140102' CONNECT BY PRIOR P_CODE = C_CODE; WITH T (SEQ, C_CODE, P_CODE, DT) AS ( SELECT '1', 'a000', '0000', '20140101' FROM DUAL UNION ALL SELECT '2', 'a101', 'a000', '20140101' FROM DUAL UNION ALL SELECT '2', 'a102', 'a000', '20140101' FROM DUAL UNION ALL SELECT '3', 'a201', 'a102', '20140102' FROM DUAL ) SELECT * FROM T WHERE C_CODE = (SELECT P_CODE FROM T WHERE DT = '20140102');

by 손님 [2014.04.08 15:24:08]
답변감사합니다... 마지막 부모끼워넣기질문은 예시가 부족했습니다 다시정정했구요..

원글질문은 깔끔하게 정리할예정입니다 저녁에^^

by 마농 [2014.04.09 08:55:16]
test 테이블에 중복 자료가 여전히 존재하네요.
날짜 컬럼이 숫자형인가요?
종료일자에 있는 0 의 의미는?
날짜 비교는 왜? 시작일만 하는지? 종료일은 아무 의미 없는지?

by 손님 [2014.04.09 09:08:38]
test테이블에 어떤것이 중복건인지요 혹시 중복된 자식에
부모코드 pcd 가
다른게 아닌지요.
일자는 I_DT O_DT 시작일 종료일 둘다
조건절에 넣었습니다. or 조건으로
또한 일자가없는건 null 인데 0으로 오타가들어갔네요. 날짜는 숫자형입니다
^^

by 손님 [2014.04.09 09:28:03]
아 중복건이 있는경우가 있습니다.. 죄송합니다. L300020001 같은경우 한부모에 두건이 존재하는경우가 있는데 이것은 GBN 값이 다릅니다 이런경우는 무조건 GBN값이 다릅니다.

by 마농 [2014.04.09 09:29:41]
SELECT * FROM test;
SELECT DISTINCT * FROM test;
두 쿼리의 건수를 비교해 보세요.

by 손님 [2014.04.09 11:14:14]
아... 그부분에 대해서 상단에 설명을 달았습니다. sys_connect_path 로 path 컬럼을 만들면 어디에 달려있는지 구분이 가죠..
하지만 여기선 중복건을 제거한다고 말씀드렸습니다. 제가 일부짠 쿼리를 보시면 row_number 로 구분하여 1인놈만 발췌했을겁니다.

by 손님 [2014.04.09 11:17:53]
LL999LBCD001, LL999LBCD002
이두놈에 연결된 자식들이 같아서 중복이라 말씀하셨던거죠^^ 실제 데이터가 이렇게 되있습니다. cpath 구한거 보시면 디코드로
1레벨 인놈은 공백처리했습니다 그거만 빼면
풀path 가 나오겠죠... 결론은 데이터가 이런구조고 중복을 제거해야 한다는겁니다.

by 마농 [2014.04.09 11:19:23]

이런 복잡한 설명을 원한게 아닙니다.
중간 산출물로 질문하지 마시고... 그냥 원본 자료를 주세요.
원본자료에 중복이 있지는 않을 것입니다.


by 손님 [2014.04.09 12:02:34]
원본자료입니다.... 아까말씀드린 path 로 유일하게 구분이 가능합니다.
실제 데이터가 저렇게 있습니다^^
혼란스럽게 해드려서 죄송합니다.
자체 해결해보도록 하겠습니다^^

by 마농 [2014.04.09 12:50:08]
원본 자료에 중복이 존재한다는것은 이해하기 어렵네요?
SELECT * FROM test;
SELECT DISTINCT * FROM test;
두 쿼리의 건수를 비교해 보면 중복 자료가 존재하는것이 확인되지요.
이 중복 자료가 실제 테이블에서도 중복자료인지 의문이네요?
1건의 자료지만 계층전개 과정에서 중복자료가 발생되었을 것 같은데
실제로 중복된다고 말씀하시는군요...

by 손님 [2014.04.09 13:57:33]
네... 실제로 저렇게 존재해요^^
전개할때 전체경로 가진 path 를 가지고있고
그것으로 자르거나 또는 코드 자리수 몇자리등등 이런식으로 되있네요....
결론은 전개해서 중복제거를 해야한다는 예기입니다.^^

by 마농 [2014.04.09 14:06:52]
실제로 적용 가능한 원본을 주세요.
위에 주신 예시에는 path 정보라든가 하는 정보가 없네요.
제가 말한 중복은 전체 레코드가 같은 걸 말합니다. 위에 주신 test 가 그렇구요.
path 가 다르다면 중복이 아닌거죠.
중복이 아닌 자료를 주세요.

by 열심히 [2014.04.09 22:40:26]

마농님 말씀데로.
중복이 있네요.
그대로 옴긴것인데.  어디선가 컬럼을빠뜨리고 넣었거나.
중복제거 하는 RNO 의 파티션이 잘못된거 같습니다.

쿼리는 고심끝에 잘짰습니다^^  좋은방향으로 짜지못해서... 문제내요..

다시 확인하고. 중복이 왜 된건지 알아내서 올릴게요...

저는 중복이 없는데... (특수한경우빼고) GBN 이 다른경우 빼고 없는줄알았거든요.
다시 실행해보니... 있네요..  죄송하고 감사합니다...

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입