질문을 제대로 했나 모르겠네요..
1 2 3 4 5 6 7 8 9 10 | 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문 돌렸는데요..
1 2 3 4 5 6 7 | select ( select wm_concat(code) from table2 where col1 = a.col1 ) bb from table1 a where rownum < 10 |
이렇게 참조하는건 되구요..ㅜㅜ
쿼리로 해결할 방법이 있는지 여쭤봅니다..
1 2 3 4 5 6 7 8 9 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 문을 사용하면 해당 조건을 타게 만들 수 있어요.
예시든 쿼리라 굳이 이 경우에는 필요 없지만.. 아래 같은 경우는 필요할 수 있죠..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 구문은 인라인뷰를 위로 올려 놓은 것이라고 볼 수 있습니다.
다시 인라인뷰로 내려도 의미는 동일하지요.
1 2 3 4 5 6 7 8 9 10 11 | 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단 구조가 가능한 쿼리죠.
1 2 3 4 5 6 7 | 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^