서브쿼리의 결과값을 다른 서브쿼리의 WHERE절에 넣고자 합니다. 0 6 3,755

by 제일 [SQL Query] [2012.11.28 22:06:13]


안녕하세요. 기존에 사용하고 있는 쿼리가 가뜩이나 UNION이 많은데, 그걸 또 반복해서 사용해야 하나 싶어 질문드립니다.

select (select min(col1) 
         from (select col1 from tbl1 where id = '0001'
               union all
               select col2 from tbl1 where id = '0001'
               union all
               select col3 from tbl1 where id = '0001'
              )
        ) AS col_min_value
      , (select col2
           from tbl2
          where col2_nm = col_min_value
          )
  from tbl1
 where id = '0001' 



위와 같이 1번 서브와 2번 서브쿼리를 사용했을 때 1번 서브쿼리의 결과를 2번 서브쿼리의 비교값으로 사용하고 싶습니다.
그런데 위처럼 alias를 주면 먹을까 해봤지만, 역시나 안먹고...
저기다가 위 min값을 구하기 위한 쿼리를 한번 더 때려박자니 실제 union이 위 쿼리보다 많습니다.
보기만 해도 비효율적임을 알수있지요.


고수분들은 저상황에서 결과값을 넣을수 있는 방안이나 혹은 다른 좋은 방안이 있으신지 여쭙고 싶습니다.

도와주세요 ㅠ^ㅠ
by 오케클릭 [2012.11.28 23:19:54]
-- 아래처럼 인나인뷰를 사용하거나 with문으로 위에 선언해도 됩니다. 
-- 같은 테이블을 3번 컬럼만 다르게 조회하는건 좀 바꾸실 필요가 있겠습니다. 
 SELECT (SELECT col2
     FROM tbl2
     WHERE col2_nm = t.col_min_value)
 FROM tbl1,
    (SELECT MIN (DECODE (lv, 1, col1, 2, col2, 3, col3)) col_min_value
     FROM tbl1,
        (  SELECT LEVEL lv
           FROM DUAL
        CONNECT BY LEVEL <= 3) tt
     WHERE id = '0001') t
 WHERE id = '0001'

by 마농 [2012.11.28 23:44:24]
-- 여러 행의 1열의 최소값은 MIN 으로 구하지만
-- 1행의 여러열의 최소값을 구하는 함수가 따로 있습니다.
-- id 가 유니크 하다면 아래와 같이 단순하게 구할 수 있습니다.
SELECT b.col2_nm col_min_value
     , b.col2
  FROM tbl1 a
     , tbl2 b
 WHERE a.id = '0001'
   AND b.col2_nm = LEAST(a.col1, a.col2, a.col3)
;

by 오케클릭 [2012.11.28 23:53:14]

// 마농님
아...그러네요~ 한동안 LEAST , GREATEST 안썼더니...까먹고 있었네요~
감사합니다. ^^


by 제일 [2012.11.29 09:58:36]
와 정말 감사합니다. 덕분에 문제가 손쉽게 해결되었습니다. 감사합니다. ^^

by 마농 [2012.11.29 10:02:19]
혹시나 해서 추가사항 올립니다.
Least, Greatest 함수는 Min, Max 와 달리 Null 값을 취급하지 못합니다.
컬럼중 널값이 들어 있다면 올바른 결과가 나오지 않고 널이 나오게 되므로
이점 주의하셔야 합니다. 널이 포함된 컬럼이 있다면 NVL 처리를 해주세요.

by 신이만든짝퉁 [2012.11.29 13:35:23]
전 요렇게 짜 봤습니다.

-- col_min_value, col2 둘 다 필요한 경우
SELECT b.col_min_value, a.col2
  FROM tbl1 a
     , (
        SELECT least(min(col1), min(col2), min(col3)) AS col_min_value
          FROM tbl1
         WHERE id = '0001'
       ) b
 WHERE a.id = '0001'
   AND a.col2_nm = b.col_min_value
;


-- col2만 필요한 경우
SELECT col2
  FROM tbl1
 WHERE id = '0001'
   AND col2_nm = (
                  SELECT least(min(col1), min(col2), min(col3)) AS col_min_value
                    FROM tbl1
                   WHERE id = '0001'
                 )
;

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