SQL질문...ㅠㅠ 0 5 1,942

by 잼띵 [2013.01.25 10:50:16]


select co140c.ITMNM, IB010d.ITM, ib010d.qty, ib010d.NET, ib030s.iqty, ib030s.iamt,ib010d.qty - ib030s.iqty as sqty, ib010d.net - ib030s.iamt as samt
from ib010m, ib010d, ib030s, co140c
where ib010m.ino = ib010d.ino
and ib010m.iodt between to_date(:as_yymm||01,'yyyymmdd') and to_date(:as_yymm||31,'yyyymmdd')
and co140c.itm = ib010d.itm

4개테이블이있고 3개테이블에 itm이라는 pk컬럼이있는데 이렇게 조건을 주면 중복된 데이터가안나오나요?
이렇게 설정하면 중복된데이터가 엄청나오는데 어떻게해야될까요... 정말 감이안옵니다 ㅜㅜ 배운적도없는 SQL
막상하려하니 너무어렵습니다
by 신이만든짝퉁 [2013.01.25 11:48:48]
테이블이 a, b, c, d 가 있고, 검색했을 경우 가장 적은 데이터가 조회되는 테이블이 a라고 가정합니다.
그리고 각각의 테이블에 p라는 pk가 모두 있다고 가정하면 아래와 같이 조인하면 됩니다.

a.p = b.p
and a.p = c.p
and a.p = d.p

질문자께서는 ib030s에 해당하는 테이블에 조인을 걸지 않아서 중복이 다수 나오는 겁니다.
해당 테이블에 pk가 존재한다면 가능한 다른테이블과 조인할 수 있는 방향으로 검색조건을 변경해 보고
pk가 설정되지 않은 테이블이라면 먼저 distinct 등을 사용해 중복을 제거하거나  where 절을 사용해 범위를 줄여보시면 도움이 될 것입니다.

아마도 각 테이블에 대한 컬럼이나 pk 등의 정보가 있다면 더 정확한 답변이 달릴 것입니다.

by 잼띵 [2013.01.25 11:59:27]

ib010m 테이블 pk 값 INO
ib010d 테이블 pk 값 INO, ITM, PONO
ib030s 테이블 pk 값 ITM, YM ,WH, LOC
co140c 테이블 pk 값 ITM 이렇게 설정되어있습니다!!

by 마농 [2013.01.25 12:20:54]
-- to_date(:as_yymm||31,'yyyymmdd') 이부분은 2월달엔 에러납니다.
-- m.iodt 가 date 타입인지? varchar2 타입인지 확인하세요.
-- 나래는 date 의 경우입니다. varchar2 라면 조건을 다르게 주셔야 합니다.
-- 알리아스 좀 사용하세요, 쿼리가 한눈에 들어오질 않습니다.
SELECT c.itmnm
     , d.itm
     , d.qty
     , d.net
     , s.iqty
     , s.iamt
     , d.qty - s.iqty AS sqty
     , d.net - s.iamt AS samt
  FROM ib010m m
     , ib010d d
     , ib030s s
     , co140c c
 WHERE m.ino = d.ino
   AND m.iodt >= TO_DATE(:as_yymm, 'yyyymm')
   AND m.iodt <  ADD_MONTHS(TO_DATE(:as_yymm, 'yyyymm'), 1)
   AND c.itm = d.itm
   AND s.itm = d.itm
   AND s.ym = :as_yymm
;

by 마농 [2013.01.25 12:25:59]
두 테이블의 관계는 몇가지로 정리할 수 있는데요.
1 : 1 관계
1 : m 관계
m : n 관계가 있습니다.
보통은 위에 두가지 경우가 대부분이며 3번째 m:n 관계인 경우엔 중복이 발생할수밖에 없습니다.
이런 관계는 특별한 목적을 가지고 사용하는 경우 외에는 잘 사용되지 않는 관계입니다.
그런데 위에 보면 pk 항목중 조인에 참여하지 못하는 항목이
pono, wh, loc 등이 있네요 ym 은 년월컬럼일듯 하여 조건을 줬습니다만 확실치 않구요.
이렇게 보면 두개 테이블의 "다"의 테이블 입니다.
즉, 두개 테이블 ib010d 와 ib030s 의 관계가 m : n 이란 얘기죠.
다 : 다 관계가 아닌 1 : 다 관계가 될수 있는 조건을 추가할 수 있는지 검토하세요.

by 잼띵 [2013.01.25 13:41:57]

감사합니다 마농님 ㅜㅜ ym컬럼은 사용안하고있었는데 그리고 알리아스값은 이렇게 하라고해서
어쩔수가 없어요 ㅜㅜ 하 뭔가 조인을 더해야되는데 글로설명하기가 너무어렵네요
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입