질문을 제대로 했나 모르겠네요..
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
이렇게 참조하는건 되구요..ㅜㅜ
쿼리로 해결할 방법이 있는지 여쭤봅니다..
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'
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' ;
출근해서 찾아보는데 작성한 소스를 못 찾겠네요.
2중 스칼라서브쿼리에서 main 테이블 조건을 받지 못해서 조건을 바깥으로 빼니
인덱스를 제대로 활용 못했던 것 같아요.
당시에 구루비에서 http://www.gurubee.net/article/14047 이 글을 보고 해결했었거든요.
기억상으로는 group by 때문이었던 것 같은데..
잠깐 테스트해보니 group by 가 있더라도 select 절에 조건을 기술하고 바깥에서 조건을
걸면 view merging이 정상적으로 되네요~
아마도 오라클 8 ~ 9i 환경에서 작성했던 것 같아요.
11g로 올라오면서 바뀐 건지 뭔지 도통 잘 모르겠네요;
다음번에 해당 쿼리 찾으면 마농님이 말씀하신 인라인뷰로
바꾸어보고 안 되면 어떤 문제였는지 글 올려볼게요~ 하루 잘보내세요^o^