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 23852 게시물 읽기
No. 23852
cross join 을 활용하여..가로를 세로로 만드는 법에대한 질문
작성자
이대리
작성일
2005-08-28 07:00
조회수
4,757

select id, max(decode(d.id, 1, A, 2, B, 3, C, 4, D, 5, E, 6, F, 7, G, 0)) ddD

from

( SELECT 11 a,22 b,33 c,44 d,55 e,66 f,77 g, T.ID

FROM

(select rownum from dict where rownum < 10) A

CROSS JOIN (SELECT rownum as ID from dict where rownum < 10) T

) d

group by ID

 

이런식으루 하면 되나요..

아니면...

이 방법 말고 더 좋은 방법 있으면, 알려주세요 ^^*

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

 

올리신 SQL이 그냥 개념의 표현으로 만드신 SQL이신가요?

아니면 실제 목적에 부합하는 SQL인가요?

 

가로 세로를 만든다고 하셨는데...

위의 SQL은 단순히 한줄짜리 결과를 리턴하는 SQL인 것 같은데요?

 

궁금하신 점이 문법이시라면 cross join은 논리적으로 명시적으로 그 것이 cross join(카티션 프로덕트,혹은 데카르트 곱이라고도 하죠)이라는 것을 명시할 뿐인 ANSI-표준 입니다. 즉 cross join 구 대신 단순히 컴마(,)만 써도 효과는 동일한..

그렇지만 궁금하신 게 문법은 아니신 듯 하구요...

 

다른 어떤 것을 찾으신다면 .. 그 이유는 지금의 그 SQL이 목적에는 부합하나 무언가 맘에 안 드시기 때문일 듯 한데요...

 

마음에 안 드시는 것이 무엇인지를 적어주시면 좋겠습니다.

 

어떤 목적으로 이런 SQL을 만들었는데 알고 보니 어떠해서 어떻게 바꾸고 싶다고..

 

이런식으로 올려주셔야 의도를 정확히 알 수 있을 것 같습니다.

 

김흥수(protokhs)님이 2005-08-28 23:47에 작성한 댓글입니다.

아 제가 말씀드린건 그 반대의 경우를 말씀드린거에요..

 

1

2

3

4

5

6

 

이걸   1,2,3,4,5,6 처럼 만드는게 아니라

1,2,3,4,5,6 처럼 하나의 레코드를

row 로 표현하는 방법을 문의드린거에요 ^^*

 

특별한 목적이 있어서그런게 아니라,,,구현방법이 궁금해서 ^^

 

 

이대리님이 2005-08-29 03:45에 작성한 댓글입니다. Edit

음..

제가 님의 SQL을 잘 못 이해 했었네요..^^(죄송)

 

님의 말씀이 어떤 말씀이신지 알겠구요

 

그런 방법은

목적마다 다르겠지만요

 

제가 해본 걸 중심으로 보면...

사실 SQL에서 제일 까다로운 것이 있다면 없는 행을 있는 것처럼 보이는 문제라고 생각합니다.

그 다음이 풀 아웃터 조인 처럼 둘 중 하나만 있어도 표현되어야 하는 경우구요...

그 다음이 방향성 그래프같은 표현(방향성 그래프는 트리를 포함하지만 C++의 다중 상속 처럼 두개이상의 부모가 있을 수 있는 상태를 말합니다. 현업 실무에서 예를 들면 행정구역 같은 지역 단위가 이합 집산하는 것을 표현하는 경우를 예로 들 수 있습니다.)이었습니다.

 

방법 자체가 어렵다기 보다는 문제 해결이 어렵다는 의미이구요(문제 해결이 어렵다는 의미는 아웃풋은 어케해서 나온다해도 사용자를 만족 시키기 어려운 경우가 많다는 점이구요... 그래서 설계상에 실제 발생하지 않는 데이타를 내부적으로 발생시키는 경우도 있었습니다.)

 

각설하고 컬럼을 행으로 푼다거나 하는 경우는 없는 행을 있는 것처럼 만드는 것인데요.

 

위의 경우(님께서 사용하신 SQL)는 행으로 풀었다가 다시 합치는 경우이네요...

제가 실무에 사용해본 것으로 분류를 해보면 ... 없는 행을 있는 것처럼 나타내는 경우는

1. 카티션 프로덕트를 활용하는 방법

2. 쎄타 조인을 사용하는 방법

3. UNION을 사용하는 방법

4. connect by의 부수적 효과를 이용하는 방법

 

등이 있을 수 있습니다.

 

이중에서 1,2번은 사실상 원리적으로 동일한 방법입니다. 둘 다 불완전한 JOIN을 사용하는 방법이구요.

1번 방법을 사용한 후 원하는 그룹단위로 다시 집계를 하는 방법은 복제를 이용한 방법으로 널리 알려져 있던 방법이더군요.(사실 관계형 데이타베이스의 이론을 창시하신 수학자+공학자분들이 수학의 관계에서 차용하여온 용어인 카티션프로덕트라던가 ... 뭐 이런 용어가 분명 있는데... 굳이 왜 복제를 이용한 방법이라는 말로 일반적 개념을 특별화하는 지는 저도 이해를 잘 못하겠습니다만..)

2번의 방법은 주로 날짜 이전 자료의 집계나 계정코드 같은 단일 키 분류 기준 코드를 상위로 집계하여 보여주는데 주로 사용되구요 특히나 계정코드 같은 것의 상위 집계 같은데서 쓰일 경우는 일종의 connect by의 상위 집계 효과를 볼 수 있습니다.

1번 및 2번은 행으로 펼쳤다가 재 집계하는 기준에 따라서 roll-up이나 cube의 효과를 볼 수 있죠...

3번의 UNION을 사용하는 방법은 어떻게 보면 가장 무식해 보이는 방법이기는 하나... 우리가 알고리즘 같은 거 공부할 때 어려운 문제에 대한 최초의 가장 쉬운 접근 시도는 어려운 문제를 쉽고 작은 문제로 나누고 이를 다시 통합하는 시도를 해보라는 금언(분할정복법)에 부합하는 상당히 직관적인 방법이라 좋다고 생각합니다.

4번은 connect by 구문의 특별한 수행 방법에서 기인하는 것인데요....

특히 역전개의 경우 간노드들이 중복해서 나타나는 것을 말하구요...

4번의 경우 분석함수와 같이 사용하면 스칼라 서브쿼리를 피하며 수행성능을 올릴 수 있는 경우를 볼 수도 있습니다.

connect by가 없는 행을 있는 것처럼 보여주는 것 중의 하나라는 점이 언뜻 동의하실 수 없는 사항일 수도 있는데요....

connect by는 어쨋든 동일한 부모 노드에서 파생된 간노드 및 잎노드간에 자기 반복적인 join을 만들어주는 것이므로 사실 없는 행을 있는 것 처럼 보여주는 것의 한 종류라 해도 틀린 말은 아닙니다.

 

이렇듯 목적에 따라 다양한 방법이 있습니다.

 

물론 이것도 단지 제가 아는 범위의, 제가 해본것을 중심으로 분류한 것에 지나지 않구요...아마 더 찾아본다면 더 있을 것으로 생각됩니다.

요는 소잡는데는 소잡는 칼. 닭잡는데는 닭잡는 칼을 써야한다는 것이 제 생각입니다.(몇가지 테크닉을 익히기보다 목적에 맞는 방법을 꾸준히 만들어 사용하는 것을 말합니다.)

.... 무엇보다 중요한 것은 자신이 알고 있는 것을 다음번에 응용하기 위해 잘 정리하고 지식을 공유하는 것은 중요하지만 이름 붙이기나 분류하기에 집착해서 해결법을 화석화 시키지 않고 여러가지로 시험,시도하는 자세라 생각합니다. ^^ (연구 많이 하셔서 여기에 올려주세요^^)

 

김흥수(protokhs)님이 2005-08-29 08:08에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
23855varchar(1)와 char(1)의 차이??? [3]
초보
2005-08-29
3425
23854리눅스에서 oracle9i, oracle10g 설치시 질문입니다. [1]
오라클
2005-08-28
1289
23853오라클의 뷰 테이블에서 한글을 가져오면 한글이 깨지는군요. [2]
서진석
2005-08-28
2315
23852cross join 을 활용하여..가로를 세로로 만드는 법에대한 질문 [3]
이대리
2005-08-28
4757
23851에러입니다! 확인 좀 부탁드리겠습니다. [2]
강진우
2005-08-27
2188
23850칼럼 데이터 타입을...예약어를 적용가능하게 하려면??? [5]
권민수
2005-08-27
1100
23848AIX에 오라클 클라이언트 설치시 에러 [1]
이현석
2005-08-26
1419
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다