join 관련하여 다른점 질문 0 7 531

by 미코 [SQL Query] [2017.02.23 17:42:50]


안녕하세요.

업무를 보다가 이해가 안되는부분이 있어서 여쭙니다..

 

질문1

i 테이블과 a테이블을 조인하는 부분인데요

제가 생각했을땐 같은 문장인데 결과가 다르게 나와서.. 원인을 모르겠습니다

1. AND ( i.changetype||' '||i.changecode = 'A '||a.assign(+))
2. AND  i.changetype = 'A'       and i.changecode  = a.assign(+)

 

질문2

i테이블과 a테이블을 조인할때에 outer join으로 b테이블에는 없어도 조회가 되게끔 하고 싶은데

잘안되네요.. 원인과 해결책좀 알려주시면 감사하겠습니다.

select a.*

  from subject a

      , course b

and a.year = b.year(+)

and a.season = b.season(+)

and a.subjectcode = b.subjectcode(+)

and a.division = b.division(+)

너무 무지한거같아 좀 민망하네요..

 

* 질문2는 너무 멍청한질문이어서 삭제했습니다;

by jkson [2017.02.23 17:55:54]

질문1 혹시 changetype이나 assign 데이터형이 varchar형이 아니라 char형(길이 2이상) 아닌가요? 두 컬럼 데이터형이 뭔가요?

질문2 저대로 쿼리하신 것 맞나요? 빠진 내용 없는지..


by 미코 [2017.02.23 18:23:53]

changetype char(1)

chantcode varchar2(7)

입니다.

이거에 따라서 차이가 있는건가요?


by jkson [2017.02.23 18:44:14]

assign 컬럼 데이터형은요? 일반 조인할 때는 자동형변환 됩니다만 char형과 문자열을 concat하면 char형 빈공간 만큼 공란이 생깁니다. 그게 아니라면 어떤 이유인지 생각 좀 해봐야겠네요.. 별개로.. 1번 같은 방법인 의도적으로 인덱스 조인 안 되게 할 때 사용하는 방법이고 일반적인 상황에서는 2번과 같이 사용하여야 인덱스를 사용하여 조인할 수 있게 됩니다.

--char형 concat 테스트
with t as
(
select cast('A' as char(12)) acol, cast('1' as varchar2(20)) bcol from dual union all
select cast('A' as char(1)), cast('2' as varchar2(20)) from dual
)
select acol||' '||bcol concated from t

 


by 마농 [2017.02.24 09:15:37]

i 와 a 의 아우터 조인 관계인데...
아우터 조인은 i 는 모두 나오고 a 는 조인에 성공한 것만 표시되고 나머지는 널로 표시되죠.
  - 1번의 경우엔 i 가 모두 나오게 됩니다.
  - 2번의 경우엔 i 가 모두 나오는게 아니라 (i.changetype = 'A') 인 것만 나오죠.
즉, 결과 건수가 다르게 되는 거죠.


by jkson [2017.02.24 09:35:44]

아! 아우터 조인이이니 그렇겠네요. 1번 쿼리는 changetype이 A가 아니라도 다 나오겠군요. 제가 완전 잘못된 정보를 전달했네요. 다시 보셔야할텐데.. 깊이 생각 안하고 댓글 달았다가 질문하신 분 혼돈만 드렸네요 ㅠ


by 미코 [2017.02.28 18:29:13]

마농님 jkson님 답변감사드립니다.

그런데 ( i.changetype||' '||i.changecode = 'A '||a.assign(+)) 이것의 결과가 i가 다 나오는이유를 모르겠더라구요..

그럴꺼면 그냥 i.changecode = a.assign(+) 이렇게만 하면 될것을

왜 굳이 저렇게 했을까요..?


by 마농 [2017.03.02 09:05:59]

1. i가 다 나오는 이유는?
  - 이유가 없습니다.
  - 그냥 아우터 조인의 의미가 원래 그렇기 때문입니다.
2. 그럴꺼면 그냥 i.changecode = a.assign(+) 이렇게만 하면 될것을?
  - 아닙니다. 결과가 다릅니다.
  - i 가 다 나오는 것은 맞지만. a 의 표현범위가 다릅니다.
  - 원래의 쿼리는 i.changetype 이 'A' 인 것에 대해서만 a 가 표시됩니다.
  - 제시하신 쿼리는 changetype 에 상관 없이 표시되겠지요.
3. 왜 굳이 저렇게 했을까요..?
  - 그건 해당 코드를 작성한 사람만 알겠죠?
  - 의도를 가지고 정확하게 작성한 코드일 수도 있고
  - 의도와 다르게 잘못 작성한 코드일 수도 있습니다.
  - 원하시는 것이 무었인지 정확하게 파악하셔야 합니다.
  - i 가 모두 나오면서 'A' 인 것만 a 를 표시하는 것인지?
  - i 중 'A' 인 것만 추출할 것인지?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입