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 3472 게시물 읽기
No. 3472
쿼리좀 작성문제입니다..
작성자
초보입니다(kimsh520)
작성일
2017-08-23 11:27
조회수
2,921

FROM NIC61B A,

NIC99B B,

NIC63B C,

nic01b D,

nic04b E

WHERE A.GNL_AC_NO = B.GNL_AC_NO(+)

AND A.GDS_NO = B.GDS_NO(+)

AND A.DL_DT = B.DL_DT(+)

AND A.DL_SQ = B.DL_SQ(+)

AND A.GNL_AC_NO = C.GNL_AC_NO(+)

AND A.GDS_NO = C.GDS_NO(+)

AND A.DL_DT = C.DL_DT(+)

AND A.DL_SQ = C.DL_SQ(+)

AND A.RNMCNO = D.RNMCNO

AND D.RNMCNO = E.RNMCNO(+)

AND E.CNTC_TYP_CD(+) = '1'

AND A.GNL_AC_NO = 243469999

AND A.GDS_NO = 01

AND A.DL_DT >= '20081204'

AND A.DL_DT <= '20100202'

ORDER BY A.DL_DT,LPAD(TRIM(A.DL_TM),6,'0')

========================================================

위의 내용을 (+)를 사용하지않고 LEFT OUTER JOIN , RIGHT OUTER JOIN 을 사용하여 변환을 어떻게해야하나요... 꼭좀부탁드립니다..

 

 

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

SELECT *
  FROM nic61b a
  LEFT OUTER JOIN nic99b b
    ON a.gnl_ac_no   = b.gnl_ac_no
   AND a.gds_no      = b.gds_no
   AND a.dl_dt       = b.dl_dt
   AND a.dl_sq       = b.dl_sq
  LEFT OUTER JOIN nic63b c
    ON a.gnl_ac_no   = c.gnl_ac_no
   AND a.gds_no      = c.gds_no
   AND a.dl_dt       = c.dl_dt
   AND a.dl_sq       = c.dl_sq
 INNER JOIN nic01b d
    ON a.rnmcno      = d.rnmcno
  LEFT OUTER JOIN nic04b e
    ON d.rnmcno      = e.rnmcno
   AND e.cntc_typ_cd = '1'
 WHERE a.gnl_ac_no   = 243469999
   AND a.gds_no      = '01'
   AND a.dl_dt      >= '20081204'
   AND a.dl_dt      <= '20100202'
 ORDER BY a.dl_dt, LPAD(TRIM(a.dl_tm), 6, '0')
;

마농(manon94)님이 2017-08-24 11:28에 작성한 댓글입니다.

E.CNTC_TYP_CD(+) = '1' 이부분을 LEFT OUTER JOIN AND e.cntc_typ_cd = '1'

해주셨는데

 

저건 right outer join 아닌가요??

초보입니다(kimsh520)님이 2017-08-24 13:39에 작성한 댓글입니다.

left 와 right 조인은 테이블의 순서와 관련이 있습니다.
 - d LEFT  e
 - e RIGHT d
on 의 조건절 순서(좌변 = 우변)와 관련이 없습니다.
 - (e = 1) (1 = e) 순서와 상관 없음

마농(manon94)님이 2017-08-24 15:08에 작성한 댓글입니다.
이 댓글은 2017-08-24 15:17에 마지막으로 수정되었습니다.

관련이 없다는 말은 즉슨

AND E.CNTC_TYP_CD(+) = '1'

이문장이

AND E.CNTC_TYP_CD = '1'(+)

이런형태여도

LEFT OUTER JOIN nic04b e

ON d.rnmcno = e.rnmcno

AND e.cntc_typ_cd = '1' <--이부분이 동일하다는 말씀이신거네요

초보입니다(kimsh520)님이 2017-08-24 15:35에 작성한 댓글입니다.

E.CNTC_TYP_CD = '1'(+) 이런 형태는 애초에 불가능한 형태이구요.
D 와 E 와의 관계에서 어느 것이 주가 되는지를 파악하시면 됩니다.
D = E(+) 였다면?  ==> D LEFT E 가 되는 거구요
D(+) = E 였다면?  ==> D RIGHT E 가 되는 것입니다.
조건절 좌변 우변이 상관 없다는 것은
D = E(+)
E(+) = D
이렇게 좌우를 바꿔도 동일하다는 거죠.

마농(manon94)님이 2017-08-24 16:11에 작성한 댓글입니다.

from C_MENU_WINDOW_MAP a,

C_WINDOW_ACT b ,

C_WINDOW_DISPLAY c,

C_AUTH_WINDOW_MAP d

where c.WINDOW_ACT_ID = b.WINDOW_ACT_ID

and b.WINDOW_ACT_ID = a.WINDOW_ACT_ID

and d.WINDOW_ACT_ID (+) = a.WINDOW_ACT_ID --이부분

이런 문장이 있는데요

제가생각했던건

from C_WINDOW_DISPLAY c INNER JOIN C_WINDOW_ACT b ON c.WINDOW_ACT_ID = b.WINDOW_ACT_ID

INNER JOIN C_MENU_WINDOW_MAP a ON b.WINDOW_ACT_ID = a.WINDOW_ACT_ID

RIGHT OUTER JOIN C_AUTH_WINDOW_MAP d ON d.WINDOW_ACT_ID = a.WINDOW_ACT_ID -- 이부분

 

근데 결과값이 틀리더라고요 이부분을 RIGHT 가아닌 LEFT 로해야하는데 왜그런지 이해가안갑니다..말씀하셨던 주테이블 관련같은데 주를 어떻게 따지나요;;;

 

초보입니다(kimsh520)님이 2017-08-24 17:47에 작성한 댓글입니다.

(+) 가 없는 쪽이 메인이구요.
(+) 가 붙은 쪽이 서브입니다.
LEFT JOIN 의 경우 왼쪽 테이블이 메인이 됩니다.
여기서 말하는 왼쪽은 (a LEFT JOIN d) 의 왼쪽입니다.
(d.window_act_id (+) = a.window_act_id) 의 왼쪽이 아닙니다.
ANSI JOIN 의 경우에만 왼쪽/오른쪽 이 의미가 았고
(+) 를 이용한 조인에서는 (+) 가 있는쪽/없는쪽 으로 구별합니다.

마농(manon94)님이 2017-08-28 08:52에 작성한 댓글입니다.
이 댓글은 2017-08-28 10:53에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
3475db2 toad접속방법 [1]
초보입니다
2017-08-28
4126
3474db2툴 [1]
초보입니다
2017-08-28
3737
3473db2오류 [4]
초보입니다
2017-08-24
3353
3472쿼리좀 작성문제입니다.. [7]
초보입니다
2017-08-23
2921
3471db2 (+) [1]
초보입니다
2017-08-18
3206
3470DECFLOAT_FORMAT 에러 [1]
초보입니다
2017-08-16
3373
3469db2쿼리... [11]
초보입니다
2017-08-08
5365
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다