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 23998 게시물 읽기
No. 23998
JOIN의 기술
작성자
퓨쳐
작성일
2005-09-07 23:53ⓒ
2005-09-08 00:14ⓜ
조회수
2,066

Stored procedure 으로 기능을 구현하고 있는데

join 만 잘 응용하면 원하는 값을 추출할 수 있을 것 같은데

쉽지 않네요 ㅡ.ㅡ;

join을 이용하든 커서를 사용하든 원하는 결과만 나오면 됩니다.

 

아래와 같이 3개의 테이블이 존재합니다.

A테이블과 B테이블은 1:N 관계이고 제가 구하고자 하는 값은

아래와 같습니다.

 

A테이블

GRP

VAL

GRP1

3

GRP2

4

GRP3

6

GRP4

9


B테이블

GRP

CD

GRP1

A

GRP1

B

GRP2

A

GRP3

C

GRP4

E

.

.

 

C테이블

CD

TMP

A

X

B

X

A

Y

C

Y

E

Z

.

.



 

 

먼저 C 테이블의 TMP 값에 해당하는 CD 값을 구합니다.

 

예를 들어 TMP='X' 인 경우엔

C테이블의 CD 컬럼값이 A,B 로 추출됩니다.

이 A,B 값을 가지고 B테이블에서 A,B의 값으로 그룹핑 되어 있는

값이 있나 찾아봅니다.

이 예의 경우 GRP컬럼의 값이 GRP1로 구해져서

최종적으로 A테이블에서 추출되는 값은 아래와 같이 1행이 나오면 됩니다.

GRP1

3


 

그러나 TMP='Y' 인 경우엔

C 테이블의 CD 컬럼값이 A,C 로 추출됩니다.

위와 마찬가지로 A,C 값을 가지고 B테이블에서 A,C 값으로 그룹핑 되어있는

값을 찾아봅니다. 그러나 이경우엔 그룹핑 되어 있는 값이 존재하지 않고

GRP2 , GRP3 각각의 GRP 값으로 존재하고 있으므로 최종적으로 A테이블에서

추출되는 값은 아래와 같이 두개의 행이 나오면 됩니다.

GRP2

4

GRP3

6



 

C 테이블의 TMP='Z' 인 경우엔

아래와 같이 한개의 행이 추출되면 되겠죠 ^^

GRP4

9



 

 

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

그룹핑에 대한 정의를 확실히 해야 정확한 쿼리가 나올거 같군요.

 

그러나 TMP='Y' 인 경우엔

C 테이블의 CD 컬럼값이 A,C 로 추출됩니다.

위와 마찬가지로 A,C 값을 가지고 B테이블에서 A,C 값으로 그룹핑 되어있는 ===> 이 문장에서 A,C값으로 그룹핑이 되어있다는 말이 정확히 무슨 의미인가요?

A,C값의 순서대로 나열되었다는 의미?  - 1)

A,C값이 인접해서 나열되었다는 의미?  - 2)

A,C값의 순서나 인접성과 무관하게 가능한 모든 조합에서 찾겠다는 의미? - 3)

1),2) 혹은 1)과2) 둘다일 경우는 모르겠지만 3)의 경우라면 보여진 예와는 다른 결과가 나오니까요.

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-08 11:04에 작성한 댓글입니다.

 

답변 감사드립니다.

제가 설명을 너무 어렵게 했나 봅니다. ^^;;

순서와 인접성과는 무관하게 그룹핑 되어 있는 값에 우선순위를

두고 값을 조회한다는 뜻입니다.

 

이해를 돕기 위해서 제가 최초 질문에서 예를 들었던 내용을

더 상세히 설명을 드려 봅니다.

 

C테이블의 TMP='Y' 인 경우엔 C테이블에서 추출되는 값은

CD

TMP

A

Y

C

Y

위와 같게 됩니다.  CD 값이 A 와 C 가 되죠

추출된 CD 값 (A와C) 를 가지고  B테이블에서 값을 조회해 봅니다.

그러나 B테이블에서 A와C의 조합으로 그룹핑되어 있는 값이 없고

GRP2

A

GRP3

C

위와 같이 각각의 GRP2,GRP3값으로 존재하고 있습니다.

따라서 A테이블에서 최종적으로 목표가되는 데이터를 조회해보면

 

GRP2

4

GRP3

6

이렇게 나오게 되는것 입니다.

 

 

그러나 CD 값이 A와B인 경우엔 아래와 같이 GRP1으로

그룹핑이 되어 있어서

GRP

CD

GRP1

A

GRP1

B

 

A테이블에서 GRP1인 것으로 조회를 해서 최종 목표값이 아래와 같이

나오게 되는 것입니다.

GRP

VAL

GRP1

3

 

퓨쳐님이 2005-09-08 18:21에 작성한 댓글입니다.
이 댓글은 2005-09-08 18:22에 마지막으로 수정되었습니다. Edit

추출된 CD 값 (A와C) 를 가지고  B테이블에서 값을 조회해 봅니다.

그러나 B테이블에서 A와C의 조합으로 그룹핑되어 있는 값이 없고

GRP2

A

GRP3

C

위와 같이 각각의 GRP2,GRP3값으로 존재하고 있습니다.

===> 라고 하셨는데요, B 테이블에는 CD 값이 A인 GRP1도 있습니다.

B테이블

GRP

CD

GRP1

A

.

.

A와 C의 조합을 생각할때 왜 위의 row는 제외를 하시는 건지요?

이것이 문제입니다.

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-08 18:55에 작성한 댓글입니다.

답변 감사드립니다.

계속 번거롭게 하는 것 같네요.. ^^;

조합이라는 단어 때문에 질문내용의 의도가 자꾸 비껴가는 것 같네요.

다시 차근차근 질문 드려봅니다.

결론적으로 말씀드리면 포함하고 있는 모든 값이 아니라

조합의 일치에 해당하는 그룹값만 가져오는게 목표입니다.

 

C 테이블에서

TMP='Y'인 경우 CD 값이 A와 C 입니다.

이 값을 가지고 B 테이블에서 원하는 그룹핑값을 찾습니다.

(이 표현이 가장 적절한 것 같네요 ^^)

B테이블에서 A와 C의 값(조합)으로 그룹핑 되어져 있는 값

(포함이 아니라 조합의 일치)이 있는가 찾습니다.

찾아보니 A와 B의 조합으로 그룹핑 되어 있는 값은 있는데 

A와C의 조합으로 그룹핑 되어 있는 값은 존재하지 않고

각각의 행으로 존재하네요.

 

GRP

CD

GRP1

A

GRP1

B

GRP2

A

GRP3

C

 

쉽게될 것 같으면서도 까다로운 재미있는 문제네요. 흐.. ;;

답변 부탁드리겠습니다.

 

퓨쳐님이 2005-09-08 20:44에 작성한 댓글입니다.
이 댓글은 2005-09-08 21:04에 마지막으로 수정되었습니다. Edit

GRP

CD

GRP1

A

GRP1

B

GRP2

A

GRP3

C

각각의 행으로 존재한다는 말은 둘의 조합이 인접해 있다는 말인가요?

위의 B테이블에서 3,4번째의 A,C 조합만을 고려하시는데요, 왜 1,4번째의 A,C의 조합은 제외시키는 건가요? 규칙이 먼가요?

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-08 20:54에 작성한 댓글입니다.
이 댓글은 2005-09-08 21:10에 마지막으로 수정되었습니다.

실시간이시네요 ^^;;

기준을 GRP 값으로 생각하시면 쉬울듯 합니다.

1번째 A는  B와 함께 GRP1으로 묶여 있기 때문에 안되는 겁니다.

 

규칙의 이해를 돕기위해 간단한 예로 설명을 드려봅니다.

 

추석선물세트를 사려고 합니다.

내가사고 싶은 선물은 샴푸와 린스입니다.

=>C테이블의 CD값 A(샴푸) C(린스)

 

근데 내가 선물을 사려고 보니 샴푸,비누로 제품이

구성되어진 선물세트만 있고

=>B테이블의 GRP1 : A(샴푸),B(비누)

샴푸와 린스는 각각의 상품으로 밖에 존재하지 않는군요.

=>B테이블의 GRP2 :  A(샴푸)

    B테이블의 GRP3 :  C(린스)

 

따로 사면 되는거지 굳이 선물세트에서 샴푸를 꺼내서

샴푸를 두개 살 필요가 없겠죠?

규칙이 이해가 되셨나요? ^^

 

퓨쳐님이 2005-09-08 21:33에 작성한 댓글입니다.
이 댓글은 2005-09-08 21:35에 마지막으로 수정되었습니다. Edit

네, 이해했습니다. 마지막으로 한가지만요.

만약 GRP1으로 묶여진 값이 A,B,C 3개가 있다고 할때,

(A와 B)의 조합만으로(C는 아님) 찾을때도 GRP1이 나와야 되는건가요?

아니면 묶여진 값 전체인 (A,B,C)의 조합으로 찾을때만 GRP1이 나와야 되는 건가요?

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-08 21:59에 작성한 댓글입니다.

ㅎㅎ 감사합니다.

A와 B로 찾을때는 나오면 안되고

A,B,C의 조합이 다 일치하는 경우만  GRP1이 나와야 합니다.

 

만약에 C테이블의 CD 값이 A,B,C 이라면

B테이블에서 데이터를 찾을땐 

A,B의 조합 GRP1 과  C에 해당하는 GRP3 이렇게  나와야 합니다.

 

장시간 번거롭게 해드려서 죄송합니다.

좋은밤 되세요~^^

퓨쳐님이 2005-09-08 22:41에 작성한 댓글입니다.
이 댓글은 2005-09-08 22:43에 마지막으로 수정되었습니다. Edit

ㅋㅋㅋ, 이거참 경우의 수가 많군요.

 

만약에 C테이블의 CD 값이 A,B,C 이라면

B테이블에서 데이터를 찾을땐 

A,B의 조합 GRP1 과  C에 해당하는 GRP3 이렇게  나와야 합니다.

 

라고 하셨는데요, 만약에 GRP1으로 묶여진 값이 A,B가 있고,

GRP2로 묶여진 값이 A,C가 있다면(Business Logic이 그렇다면),

C테이블에서 CD값이 A,B,C로 찾는 경우가 있다면, GRP1,GRP2가 모두 나와야 하나요? 아니면 이런 경우는 없나요? 아니면 어떤 다른 결과가 나와야 하나요? 질문이 너무 많아지네요 ㅋㅋㅋ

Business Logic이 명확하지 않은 것인지, 제가 이해를 못하는 것인지 모르겠네요.

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-08 22:59에 작성한 댓글입니다.
이 댓글은 2005-09-08 23:00에 마지막으로 수정되었습니다.

장진주님께서 잘 이해하지 못하시는게 당연합니다.

Business Logic 자체가 이런 경우의 수가 많아서 

설명을 한다고 해도 어려움이 있고 최종 목표값을 추출하는데에도

어려움이 있는겁니다. ㅋ~

 

C테이블에서 CD값이 A,B,C로 찾는 경우가 있다면,

GRP1,GRP2가 모두 나와야 합니다.

 

실제적으로 업무처리시 B테이블의 데이터가

이와같이 여러개의 경우의 수로 존재하고 있는 경우는 거의 없겠지만,만약 B테이블에 (A,B ) (A,C) 이외에 (B,C)로  이루어진 GRP5가

존재하고 있다면 GRP1,GRP2,GRP5가 나와야 합니다.

 

C테이블에서 추출된 CD값의 조합을 만족하는 GRP가 없다면

전에도 설명 드렸다시피

[

 만약에 C테이블의 CD 값이 A,B,C 이라면

 B테이블에서 데이터를 찾을땐 

 A,B의 조합 GRP1 과  C에 해당하는 GRP3 이렇게 

 나와야 합니다.

]

 

위의 굵은글씨 C의 경우처럼 개별 건으로 나와야겠죠. ^^

(조합에 해당하는 그룹값(GRP값)이 우선이고

 충족되는 그룹값이 없을 경우 개별건으로 나와야 합니다)

 

계속되는 답변 감사드립니다. 꾸뻑~

나중에 밥이라도 사드리고 싶네요 ..ㅋㅋ

 

퓨쳐님이 2005-09-09 07:46에 작성한 댓글입니다.
이 댓글은 2005-09-09 07:51에 마지막으로 수정되었습니다. Edit

갈수록 볼수록 재미있는 logic이군요...

만약, 찾는 CD값이 5개라면 5개의 모든 가능한 조합을 생각해서

해당 조합과 일치하는 B테이블의 데이타가 있는지를 모두 찾아내야

하는 경우가 생기는 군요.

 

예를 들어 CD값이 A~E의 5개로 찾는다면,

(A,B,C,D,E) 의 조합을 B테이블에서 찾고, 없으면

(A,B,C,D) 의 조합

(A,B,C,E) 의 조합

.....

.....

 

그렇다면, 개별건으로 나와야 하는 경우는 CD값 2개 이상의 조합으로

찾을수 없었을 경우에만 인가요?

만약 개별건으로 나와야 하는 GRP 값이 여러개이면 그 모두가 다 나와야 하는건가요? (예를 들어, CD값 C는 개별건으로만 찾을수 밖에 없는데, C에 해당하는 GRP값이 GRP1,GRP2이 있다면 둘다 나와야 하냐는거죠.)

 

갈수록 재밌어지네요.

꼭 쿼리를 만들고야 말겠습니다. 하하^^

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-09 10:11에 작성한 댓글입니다.
이 댓글은 2005-09-09 10:13에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
24001오라클이 설치된 os가 날아갔습니다. [4]
김세익
2005-09-08
1487
24000급질문] 토드이용해서 엑셀파일로 export하기 [2]
무림지존
2005-09-08
3213
23999토드 사용시 질문요. [1]
초보
2005-09-08
1115
23998JOIN의 기술 [11]
퓨쳐
2005-09-07
2066
23997특정 컬럼 값을 이용하여 레코드 삭제가 가능한가여 [4]
이태수
2005-09-07
1028
23996dba_free_space에는 존재하지 않는 이유 [3]
게오르그
2005-09-07
1153
23995SQLPLUS 실행이 안되네요. [1]
질문이용^^
2005-09-07
2097
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다