안녕하세요 급하게 돌다돌다 이곳에 오게 되었습니다. 쿼리짜는데 몇시간째입니다. 도움좀 부탁드리겠습니다! 0 8 5,068

by 손님 [SQL Query] 트리구조 오라클 쿼리 sql 아키 [2011.09.29 17:59:43]


TYPE 테이블

type_id(integer,PK)
1
2
3


SUN 테이블

sun_id(integer,PK), date_month(date), type_id(integer)
1                            2011-10                1
2                            2011-10                1
3                            2011-11                2
4                            2011-11                2
5                            2011-10                2


이런 구조의 테이블 2개가 있습니다.
먼저 결과 화면
type_id(integer), date_month(date)
1                        2011-10
2                        2011-10
2                        2011-11
3                        2011-09

이렇게 나오게 하고 싶습니다.. 도저히 저의 머리로는 ㅠㅠ
먼저 부모테이블 type_id를 뿌리고
자식테이블에 해당 type_id를 가지고 있는 넘들을 date_month로 묶어서
뿌려줍니다.
마지막 관건.. 부모테이블 3값은 있는데 자식테이블에 3값을 부모로 물고 있는 넘들이 없을때
type_id를 뿌리고 date_month값은 그냥 현재 달을 뿌리고 싶습니다.

설명을 잘했는지 모르겠네요 ㅠㅠ
워낙 퇴근시간다되가서 급하게 쓰느라..
테이블 두개인데 부모테이블 자식테이블 자식테이블로만 뿌리니 3값을 가진 행이 안나오고..
부모테이블 메인으로 잡고 두번 와일문 돌리니 페이지 구현에 행의숫자 전체 숫자가 안맞고...
고민입니다...

저 두개 테이블로 저 결과가 나올수 있는 쿼리는 진정 못짜는겁니까? ㅠㅠㅠㅠㅠㅠㅠㅠ
다들 바뿌시고 퇴근시간 다되었지만 숨은 고수님들 가름침 기다리고 기다리겠습니다 ㅠㅠ
아...... DB공부 개념 지대루 첨부터 배우고 싶다 ㅠㅠ
by v상이v [2011.09.29 18:11:34]
WITH table_a AS (
SELECT '1' type_id FROM DUAL UNION ALL
SELECT '2' type_id FROM DUAL UNION ALL
SELECT '3' type_id FROM DUAL
),
table_b AS (
SELECT '1' sun_id, '2011-10' date_month, '1' type_id FROM DUAL UNION ALL
SELECT '2' sun_id, '2011-10' date_month, '1' type_id FROM DUAL UNION ALL
SELECT '3' sun_id, '2011-11' date_month, '2' type_id FROM DUAL UNION ALL
SELECT '4' sun_id, '2011-11' date_month, '2' type_id FROM DUAL UNION ALL
SELECT '5' sun_id, '2011-10' date_month, '2' type_id FROM DUAL
)
SELECT A.type_id
,NVL(B.date_month,TO_CHAR(SYSDATE,'YYYY-MM')) date_month
FROM table_a A
,table_b B
WHERE A.type_id = B.type_id(+)
GROUP BY A.type_id,B.date_month
ORDER BY A.type_id,B.date_month

원하시는게 이게 맞나 모르겠네요...

by 손님 [2011.09.29 18:38:44]
헐 v상이v 님 빠른 답변 감사합니다. ㅠㅠ

제가 잘 몰라서 그런데..
데이터값들을 임의로 잡은거지만 양이 1,2,3이 아니라 수십가지일때.. 랜덤일때는 쿼리를 어떻게 변환해야 하는지 궁금합니다.. ㅠㅠ
도움주셨는데 제가 적용해보니 잘 안되서 제실력이 모질라서 죄송합니다 ㅠㅠ 다시한번 답변 부탁드리겠습니다. 흑흑....

by 손님 [2011.09.29 18:44:59]
일단 싹붙여서 table_a, table_b랑 컬럼명만 바꿔서 하는데 에러가 이렇게 납니다.
18:44:54 Error: SQL statement doesn't return rows
일단 값이 1,2,3 이 아니라 수십가지 였을때는 어떻게 해야하는지 부탁드려요.. ㅠㅠ

by v상이v [2011.09.29 19:21:53]
값이 수십가지여도 상관없습니다...

A테이블에 대해서 B테이블을 아웃터조인으로 걸어와서

가져온 날짜값을 group by 시키고 없을땐 현재 날짜만 보여줬습니다.

데이터 양이 수십가지여도 WITH 문 제거 하고 그냥 쓰시면 됩니다~

SELECT A.type_id
,NVL(B.date_month,TO_CHAR(SYSDATE,'YYYY-MM')) date_month
FROM table_a A
,table_b B
WHERE A.type_id = B.type_id(+)
GROUP BY A.type_id,B.date_month
ORDER BY A.type_id,B.date_month

by 데니안 [2011.09.30 08:53:00]
"부모테이블의 ROWID값을 FK INDEX에 가지고 있다면..."
자식 테이블에 부모키(CID)와 부모ROWID를 포함시킨다는 의미로 보여집니다.
재밌는 제안이네요.

제가 생각한 단점은..
1. 자식테이블의 사이즈가 늘어나겠네요.
2. 부모 테이블을 재구성(REORG)할 때, 자식 테이블을 모두 UPDATE 해줘야 할수도..

by 데니안 [2011.09.30 08:53:46]
미안합니다. 다른 곳에 글을 올린다는 것이.. 이상한 답글을 올리게 되었네요.

by 손님 [2011.09.30 11:51:55]
헐 v상이v 님 대박.. ㅠㅠ 진정 고수십니다..
엄청나게 간단한 쿼리인데 왜 나는 안됐을까.. ㅠㅠ
아웃터조인.. 공부해봐야겠어요.. 맨날 IN쿼리만 써서..
아웃터조인에 대해서 자세하게 설명되있는곳 아신다면 링크좀 마지막으로 부탁드리겠습니다 ㅠㅠ 아무리 검색해봐도 그말이 그말인거같고 이해도 잘안되고. 아 내머리가 이제 딸린것인가. ㅠㅠ 상이님 답변이 저에게 큰 도움이 되었습니다 정말 고맙습니다 항상 건승하십시오! 정말 감사합니다~~11

by 손님 [2011.09.30 12:16:50]
아 v상이v님 자꾸 귀찮게 하는거 같아 죄송합니다.
혹시 저쿼리에서 table_b에 없는넘들은 현재 달을 뿌리지만
table_b에 있는넘들은 date_month로 그룹바이하고 있지요
혹 그럼 table_b에 있는넘들의 새로운 row 최종월+한달
type_id=2, date_month=2011-12 row를 추가 할수 있을까요??
결과화면
1 2011-10
2 2011-10
2 2011-11
2 2011-12 <<--- 새로 추가된 row
3 2011-09
이렇게 하려면 어떤 문법을 추가 해야할까요..
사장님의 조건이 끝이 없네요 ㅠㅠ
부탁드려요.. 고수님들 ㅠㅠ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입