select 절에 서브쿼리에서 최상위 테이블을 참조하려면?? 0 11 1,098

by 문선린 [2016.08.22 17:23:30]


질문을 제대로 했나 모르겠네요..

 

select (
        select wm_concat(code)
          from (
               select code
                 from table2
                where col1 = a.col1
               )
       ) bb
  from table1 a
 where rownum < 10

 

위 쿼리에서.. where col1 = a.col1 구문이 허용이 안되는데요..

a.col1을 참조하려면 어떻게 해야 하나요?

이런 상황이 생기면 그냥 작업테이블에 넣고 for문 돌렸는데요..

 

select (
        select wm_concat(code)
          from table2
          where col1 = a.col1
       ) bb
  from table1 a
 where rownum < 10

 

이렇게 참조하는건 되구요..ㅜㅜ

 

쿼리로 해결할 방법이 있는지 여쭤봅니다..

 

 

by jkson [2016.08.22 17:35:17]
select (with t as
        (select code, col1
           from table2
        )
        select wm_concat(code)
          from t
         where col1 = a.col1
       ) bb
  from table1 a
 where rownum < 10

 

Main 테이블의 조건이 스칼라서브쿼리가 2중 이상으로 되어서 들어가지 못할 때

위와 같이 with 문을 사용하면 해당 조건을 타게 만들 수 있어요.

예시든 쿼리라 굳이 이 경우에는 필요 없지만.. 아래 같은 경우는 필요할 수 있죠..

SELECT (SELECT RMK
          FROM (SELECT RMK
                  FROM TB_SUB
                 WHERE ID = A.ID
                ORDER BY RMK)
         WHERE ROWNUM = 1)
  FROM TB A
 WHERE ID = '2016A'
 
 
SELECT (WITH T AS (SELECT RMK, ID
                     FROM TB_SUB
                   ORDER BY RMK)
        SELECT RMK
          FROM T
         WHERE ID = A.ID
           AND ROWNUM = 1)
  FROM TB A
 WHERE ID = '2016A'

 


by 마농 [2016.08.22 17:47:59]

굳이 WITH 문이 아니어도 IN-Line View 로 해도 마찬가지로 됩니다.


by jkson [2016.08.22 17:51:06]

제가 예시를 잘못 든건가요? 위와 같은 예시 쿼리를 인라인뷰에서 하려면 어케하면 될까요? 스칼라서브쿼리가 2중구조인 걸 한 단계로 만들기 어려운 케이스가 있었는데.. 기억이 잘 안나서 대충 예시를 만들었어요.. 아 젤 작은 값이니까 그냥 MIN 하면 되네요;; 예시를 잘못들었군요;


by 마농 [2016.08.22 17:37:29]

질문 안에 이미 해결 방안이 들어 있네요.
2단 구조가 가능한데도 3단구조로 작성된 것은 아닌지 확인하여 2단 구조로 수정.


by 문선린 [2016.08.22 17:52:33]

많은 도움이 됐습니다.

자세한 답변 감사드립니다.


by 마농 [2016.08.22 17:54:50]

WITH 구문은 인라인뷰를 위로 올려 놓은 것이라고 볼 수 있습니다.

다시 인라인뷰로 내려도 의미는 동일하지요.

SELECT (SELECT rmk
          FROM (SELECT id, rmk
                  FROM tb_sub
                 ORDER BY id, rmk
                )
         WHERE id = a.id
           AND ROWNUM = 1
        )
  FROM tb a
 WHERE id = '2016A'
;

해당 쿼리 또한 2단 구조가 가능한 쿼리죠.
 

SELECT (SELECT MIN(rmk)
          FROM tb_sub
         WHERE id = a.id
        )
  FROM tb a
 WHERE id = '2016A'
;

 


by jkson [2016.08.22 17:56:43]

제가 예전에 했던 것 한번 찾아볼게요ㅋ 생각이 잘 안나서 대충 작성했더니 가능한 걸 예시를 달아버렸네요. 서브쿼리에서 GROUP BY 있었던 케이스 같았는데.. 기억이 잘..ㅠ


by jkson [2016.08.22 18:21:43]

예전 소스 찾고 있는데 비슷한 거 찾았는데 아니네요.

분명 2 DEPTH를 풀기 어려운 게 있었는데..-0-; 일단 오늘은 퇴근요..ㅠ


by 마농 [2016.08.22 18:24:11]

위와 같이 WITH 를 사용하면 INLINE-VIEW 사용과 별반 다를게 없죠.
굳이  WITH 를 써야 할 이유가 없어 보이구요. 인라인뷰로 변경 가능.
위 구문도 2단 구조가 가능하네요.
 

SELECT (SELECT MAX(SUM(col2))
          FROM tb_sub
         WHERE id = a.id
         GROUP BY col1
        )
  FROM tb a
 WHERE id = '2016A'
;

 


by jkson [2016.08.22 18:27:46]

어렴풋한 기억에는 스칼러서브쿼리에서 GROUP BY 가 있었고 메인절은 조건문이 해당 스칼라서브쿼리로 들어가지 않아서 WITH문 썼던 것 같은데 기억이 가물가물 합니다; 내일 찾아보고 다시 댓글 달게요 즐퇴하세요~^^


by jkson [2016.08.23 08:03:47]

출근해서 찾아보는데 작성한 소스를 못 찾겠네요.
2중 스칼라서브쿼리에서 main 테이블 조건을 받지 못해서 조건을 바깥으로 빼니
인덱스를 제대로 활용 못했던 것 같아요.

당시에 구루비에서 http://www.gurubee.net/article/14047 이 글을 보고 해결했었거든요.
기억상으로는 group by 때문이었던 것 같은데..
잠깐 테스트해보니 group by 가 있더라도 select 절에 조건을 기술하고 바깥에서 조건을
걸면 view merging이 정상적으로 되네요~

아마도 오라클 8 ~ 9i 환경에서 작성했던 것 같아요.
11g로 올라오면서 바뀐 건지 뭔지 도통 잘 모르겠네요;
다음번에 해당 쿼리 찾으면 마농님이 말씀하신 인라인뷰로
바꾸어보고 안 되면 어떤 문제였는지 글 올려볼게요~ 하루 잘보내세요^o^

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