SELECT절에서 코드값의 이름을 가져올때 쿼리 관련 질문 0 3 4,658

by 네오스타 [SQL Query] 공통코드 [2015.05.27 23:32:32]


안녕하세요. 궁금한게 있어서 질문드립니다.

우선 질문 전 제 테이블 상태와 조회 방향에 대해 간략히 말씀드리면..

하나의 테이블에서 조회할때 코드의 이름을 보통 5, 6개 정도 가져옵니다.
조회건수는 조건 걸고 기본 1000건 정도 됩니다.

이런 조건에서..
SELECT절에서 코드값의 이름을 가져올때 
저는 보통 이렇게 OUTER JOIN을 이용하여 코드의 이름을 가져옵니다.

WITH T AS (
  SELECT 'id1' AS id, 'abc' AS cd, 2 AS cnt FROM DUAL UNION ALL
  SELECT 'id1', 'bbb', 1 FROM DUAL 
 
), M AS (
   SELECT 'abc' AS cd, '에비씨' AS name FROM DUAL UNION ALL
 SELECT  'bbb', '비비비' FROM DUAL 
)
SELECT
  T.cd, M.name
 
FROM
  T left outer join m
  on T.cd = M.cd

이런식으로 M1, M2, M3... 테이블이 OUTER JOIN이 붙습니다.

근데 예전에 제가 어떤분이 짜는걸 봤는데 

WITH T AS (
  SELECT 'id1' AS id, 'abc' AS cd, 2 AS cnt FROM DUAL UNION ALL
  SELECT 'id1', 'bbb', 1 FROM DUAL 
 
), M AS (
   SELECT 'abc' AS cd, '에비씨1' AS name FROM DUAL UNION ALL
 SELECT  'bbb', '비비비1' FROM DUAL 
)
SELECT  T.cd, (SELECT M.name FROM M left OUTER JOIN ON (M.cd = T.cd)) AS name from dual

 

이런식으로 SELECT절에서 네임이 필요한 각 컬럼마다 마다 조인을 걸더라구요.

어느게 더 좋은 방법인지 알수 있을까요? 혹시 이유도 알수있으면 정말 좋겠네요. ㅠㅠ...

답변 부탁드립니다. 감사합니다.

by jkson [2015.05.28 07:56:00]

아래 쿼리는 동작하지 않는데..

WITH T AS (
  SELECT 'id1' AS id, 'abc' AS cd, 2 AS cnt FROM DUAL UNION ALL
  SELECT 'id1', 'bbb', 1 FROM DUAL 
), M AS (
   SELECT 'abc' AS cd, '에비씨' AS name FROM DUAL UNION ALL
 SELECT  'bbb', '비비비' FROM DUAL 
)
SELECT t.cd
     , (SELECT m.NAME
          FROM m
         WHERE m.cd = t.cd) AS NAME
  FROM t

혹시 이런 서브쿼리 말씀하시는 건지요?


by 손님 [2015.05.28 08:38:01]
JKSON님 네 맞습니다.

by 마농 [2015.05.28 08:43:56]

스칼라서브쿼리는 메인 쿼리의 건수만큼 반복 수행이 되므로, 일반적으로는 조인이 유리합니다.
그러나 메인 테이블의 건수는 많은데, 조인 항목의 값의 종류가 적어 중복값이 많은 경우
이런 경우에는 스칼라서브쿼리가 유리할 수 있습니다. 보통 코드성 테이블이 이에 속하구요.
유리한 이유는 반복 수행되는 중복값에 대해서는 재수행을 하지 않고 캐시된 값을 사용하기 때문입니다.

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