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
운영게시판
최근게시물
PostgreSQL Q&A 8675 게시물 읽기
No. 8675
multi join 문 문의드립니다.
작성자
이두기(lidoogi)
작성일
2010-06-03 09:36
조회수
8,593

http://database.sarang.net/?inc=read&aid=5765&criteria=pgsql

 

이 게시글도 참조하였습니다만

멀티조인문에서

어찌 join을 써야할지 문의드립니다.

 

select *

from a, b, c, d

where a.no = b.no and b.name = c.name and c.grade = d.grade

 

형태의 경우

 

select *

from a

inner join b on (a.no = b.no)

 

다음에서 어찌 해야 할지 모르겠습니다.

 

설령,

from b

inner join a on (b.no = a.no)

inner join c on (b.name = b.name)

이렇게 위치를 바꿔서 쓰려고 해도 다음에서 막히는군요

 

고수님들의 조언을 좀 부탁드리겠습니다.

 

감사합니다~

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

안녕하세요.

반드시 ANSI 스타일 Join이 필요하신 이유가 있는지 궁금합니다.

 

select * from a, b, c, d

where a.no = b.no and b.name = c.name and c.grade = d.grade

이러한  Theta join 스타일도 Pgsql에서 잘 처리합니다. 물론 ANSI 스타일이 명확해서 저도 선호합니다만... 만약 질문의 의도가 pgsql에서 theta join 지원여부가 아니라 theta join syntax를 ansi join syntax로 변경에 대한 것이라면 아래를 참고하세요.

select * from t1, t2, t3, t4
where t1.id=t2.id and t2.id=t3.id and t3.id=t4.id;
->

select * from t1
join t2 on (t1.id=t2.id)
 join t3 on (t2.id=t3.id)
  join t4 on (t3.id=t4.id);

김영우님이 2010-06-03 14:56에 작성한 댓글입니다. Edit

네 theta join 스타일 지원이 아니라 ansi 스타일에서의 multi join 문에 대한 질의였습니다.

제가 봐본 join 스타일이

 

from a,b,c,d

where a.id = b.id and a.name = c.name and a.grade = d.grade 형태로

inner join 을 그냥 열거하면 되었는데

 

위에 질의드린 형태처럼,

a.id = b.id and b.id = c.id and c.id = d.id 형태일 경우

어찌 처리되는지 하는 거였습니다.

(inner join 외에 left outer join이 포함됩니다.)

 

답변주신 내용을 보니,

마찬가지로 이어 열거하면 되는군요

 

저도 이런 형태로밖에 구성을 못 하겠더라구요

(ansi 스타일로 구성시에, 이런식이 맞는지도 의문이었습니다.)

 

답변 감사합니다.

 

 

참고로, 아직 배우는 입장이지만,

백만 row 정도되는 테이블들의 조인에 있어서

theta join형태보다 ansi 스타일의 정확한 조인 형태가

테이블 조인에 있어서 성능 향상에 도움이 되는거 같습니다.

 

좀더 상세히 봐야겠지만 참고하세요

 

김영우님 답변 감사합니다. :>

 

 

이두기(lidoogi)님이 2010-06-03 15:14에 작성한 댓글입니다.

ansi 스타일로 join을 했을 경우에

레코드 수가 많지 않고, 2개의 테이블을 조인할 경우에는 큰 차이를 보이지 않습니다만

많은 레코드수의 다수 테이블을 조인할 경우 ansi 스타일 조인시에 성능이 나아지는 이유(내부 로직)을 아시는 분 조언 좀 부탁드리겠습니다.

 

 

이두기(lidoogi)님이 2010-06-04 18:07에 작성한 댓글입니다.

안녕하세요,

 

SQL은 선언적 언어이니까 다른 결과는 바로 다른 실행계획을 뜻한다고 생각합니다. 만약 같은 결과를 내는 두 쿼리 중에 어느 한쪽의 실행(성능)이 다르다면 DBMS가 두 쿼리의 실행계획을 다르게 세웠다는 이야기입니다.

 

ANSI 스타일이 그렇지 않은 경우에 비해서 항상 빠르지는 않습니다. 쿼리의 성능은 실행계획이 어떻게 수립되느냐에 따라 다르니까요. 요새 왼만한 DBMS는 옵티마이저가 똑똑해서 문법의 차이에 많은 차별(?)을 두지 않습니다.

 

말씀하신 케이스도 그런 경우입니다. 같은 결과인데 쿼리 성능이 차이가 난다면 분명 실행계획이 다를 겁니다. 문법의 차이보다는 실제 성능을 좌우하는 실행계획을 확인해보시는 것을 권합니다.

 

김영우님이 2010-06-04 22:32에 작성한 댓글입니다. Edit

좋은 조언 감사합니다. :>

이두기(lidoogi)님이 2010-06-05 18:41에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
8678오늘을 기준으로 지난주 일자와 지난달 시작일자와 마지막일자를 구하고 싶습니다 [2]
일쌍다반사
2010-06-29
10834
8677도와주세요.. [3]
초보
2010-06-28
7656
86769.0 이야기 [3]
김상기
2010-06-12
8338
8675multi join 문 문의드립니다. [5]
이두기
2010-06-03
8593
8673대소문자 구분없이.. [2]
열혈지누
2010-05-31
8915
8672pgsql에서 cache 를 삭제하는 커맨드가 있을까요? [1]
이두기
2010-05-28
8689
8671A테이블에서 B테이블로 자료를 빠르게 복사하는 방법? [3]
나그네
2010-05-25
8496
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다