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