with tree as ( select * from edm_tree ) select * from edm_outsource a, tree WHERE t_category = 'P' and a.comp_id(+) = tree.pcom_id start with pid='0' connect by PRIOR tid = pid order SIBLINGS by sort_num,tname
다음과같은 쿼리를 mssql 에서 쓰게 바꿔야하는데요.
with를 이용한 가상테이블을 이미 써야하는 상황에서 start with 재귀쿼리를 넣어야하다보니 난감하네요....
원본쿼리 자체도 문제가 있어 보입니다.
- 아우터 조인을 사용한 이유가 불분명하고
- Select 리스트에 컬럼을 명시하지 않고 * 를 사용한 것도 의도가 불분명합니다.
- 쿼리에 사용된 컬럼 앞에 알리아스가 없어 어느 테이블의 컬럼인지 알 수 없으며
- 카테고리 조건을 계층 조건(start with, connect by)이 아닌 where 조건에 준것이 문제있어 보입니다.
- With 절은 굳이 왜 사용했는지 모르겠구요.
문제 있어 보이는 쿼리를 변환해봐야 문제가 그대로 따라 올 것 같아서 변환해 드리기가 난감하네요.
- 오라클 Start with, Connect by 를 이용한 계층 쿼리는
- MSSQL 에서는 WITH (CTE) 를 이용한 재귀쿼리 형태로 변환 가능합니다.
- 다만 Order Siblings by 구문은 따로 없어 정렬키를 조합하여 만들어 내야 합니다.
- 그러려면 sort_num 의 자료형이나 최대값 등을 알아야 할 것 같습니다.
- 위에 있는 불명확한 문제점들도 명확하게 풀어야 할 것 같구요.