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
운영게시판
최근게시물
DB2 Q&A 1066 게시물 읽기
No. 1066
1:N 구조에서 보통 그룹화 SELECT는 어떻게 하시나요...
작성자
난감해요
작성일
2006-07-27 06:14ⓒ
2006-07-27 06:16ⓜ
조회수
7,566

1:N의 관계를 갖는 2개의 테이블이 있을때

(뭐 쉽게 말씀드려서 폴더나 트리구조라고 볼수 있겠습니다.)

다음과 같이 그룹별로 출력을 하려면

보통 쿼리를 어떻게 작성들 하고 계신지 궁금합니다.

 

 

A 테이블 : (id integer, name long varchar)

B 테이블 : (id integer, result varchar(20))

테이블 관계 : 1:N = A:B

 

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

A.id, A.name

-- B.result

-- B.result

-- B.result

 

A.id, A.name

-- B.result

 

A.id, A.name

-- B.result

-- B.result

-- B.result

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

 

제가 생각할 수 있는 범위에서 쿼리는

1. 조인으로 한번에 가져와서 프로그램단(웹)에서 id값이 바뀌면 그룹출력을 변경한다.

A.id, A.name, B.result

A.id, A.name, B.result

A.id, A.name, B.result

:

이런 결과셋에서 A.id 값이 바뀌면 다음 그룹 출력을 하는 방식

(이방식은 A.id, A.name 필드크기가 클때 레코드셋 자체가 커져서

결과를 받아오는 시간이 커지는 단점이 있을것 같습니다.)

 

2. A 테이블에서 원하는 결과셋만 구한후에 프로그램단에서 A 테이블의 id 값으로

동적 쿼리를 작성하여 B에 in 연산으로 가져온다.

--> select id, name from A

--> (id =1 or id=2 or id=3 or id=4) ===> 이런 동적 쿼리를 생성한후

--> select id, result from B where id in (동적쿼리)

이런순으로 처리해서 프로그램단에서 결과셋을 조합한다.

(이방식은 쿼리문이 좀 지저분해지고 두번의 쿼리 횟수와

가변쿼리로 인해 캐싱도 안될것이라는 점..

그리고 인덱스를 타지못하는 in 연산을 써야한다는 점....)

 

제가 생각할 수 있는 방법은 여기까지 입니다.

 

보통 개발하시는 분들께서는 이럴때 어떻게 쿼리하시는지 궁금합니다.

 

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

with t1 (id, name) as
(values (1,'a'),(2,'b'),(3,'c')),
     t2 (id, result) as
(values (1,'1a'),(1,'1b'),
        (2,'2a'),
        (3,'3a'),(3,'3b'),(3,'3c'))

select a.id,a.name,b.result from t1 a,t2 b
where a.id=b.id;

ID          NAME RESULT
----------- ---- ------
          1 a    1a   
          1 a    1b   
          2 b    2a   
          3 c    3a   
          3 c    3b   
          3 c    3c   

 

 

위와 같은 내용이라면

님은 원하는 id값을 조건으로 사용하실 수 있으니까

 

id 에는 index가 있어야 합니다.

 

create index t1_idx1 on t1 (id);

create index t2_idx1 on t2 (id);

 

select a.id,b.result

  from t1 a,t2 b
where a.id=b.id

   and a.id in (1,2);

ID          RESULT
----------- ------
          1 1a   
          1 1b   
          2 2a   

 

in도 index를 사용합니다. 범위가 증가하면 당연히 full scan을 합니다.

 

 

 

도님이 2006-07-27 10:09에 작성한 댓글입니다.
이 댓글은 2006-07-27 10:10에 마지막으로 수정되었습니다. Edit

도님, 답변 감사합니다.

in 연산에 대해 막연히 알고있다가

dynexpln으로 떠보니 인덱스를 타네요..^^

알려주셔서 감사합니다....

 

그런데, 제가 질문을 좀 잘못했나보네요..

검색 쿼리방법은 알고있답니다. ^^;;

1번과 2번이 모두 단점을 가지고 있다고 생각되기에...

보통 어떻게들 하시는지 궁금해서 여쭤봤습니다...

1번, 2번 말고 다른 방법이 또 있는지도... ^^;;

 

도님, 한번더 답변을 해주셔서

도님 이시라면 어떻게 하실지도 알려주시면

정말 감사하겠습니다.

 

우에되었던, 답변 감사드립니다.

난감해요님이 2006-07-27 11:09에 작성한 댓글입니다. Edit

 

select a.id,b.result

  from t1 a,t2 b
where a.id=b.id

   and a.id in (1,2);

 

이렇게 하면.. 제가 잘못이해 했나요?

도님이 2006-07-27 11:13에 작성한 댓글입니다. Edit

도님, 답변 감사합니다.

 

두번째 방법을 권하시는 것으로 이해해도 되겠습니까 ?

저도 그렇게 하기로 했답니다...

답변 감사드리구요...

난감해요님이 2006-07-27 11:37에 작성한 댓글입니다. Edit

 

select gubn ,id ,max(name) name ,result
from (
select gubn ,id ,name
,case when gubn = '2' then result else ' ' end result
from (
select a.id ,a.name ,b.result
from t1 a ,t2 b
where a.id=b.id
) ab, (
select '1' gubn
  from sysibm.sysdummy1  union all
select '2' gubn
  from sysibm.sysdummy1
) dm
) rs
group by id,gubn,result

 

결과

gubn/id/name/result
1   1   aaa
2   1   aaa   r11
2   1   aaa   r12
2   1   aaa   r13
1   2   bbb
2   2   bbb   r21
2   2   bbb   r22
2   2   bbb   r23

박진복(pjb708)님이 2006-08-07 11:52에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
1069[질문] 프로시저를 삭제하려고 해도 삭제가 안됩니다. [2]
이준식
2006-07-31
7839
1068[질문] 스토어드 프로시져 실행방법이 궁금합니다. [2]
이준식
2006-07-29
8393
1067JOIN 결과 UPDATE ?? [2]
2006-07-28
9322
10661:N 구조에서 보통 그룹화 SELECT는 어떻게 하시나요... [5]
난감해요
2006-07-27
7566
1065IBM db2 에 관해 몇가지 궁금한점이 있습니다. ^^? [1]
김경원
2006-07-26
7761
1064오라클의 TO_NUMBER함수를 대신할 수 있는 DB2 함수는?? [1]
노는사람
2006-07-26
8278
1063카탈로그 (catalog)질문드립니다. [1]
카탈로그
2006-07-26
7571
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다