두개의 테이블에 저장된 데이터를 재귀형식으로 출력하려합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | WITH LOG_CTE AS ( SELECT TaskLotLogs.* , TaskLogs.TaskLogID, TaskLogs.TaskID, TaskLogs.TaskType, TaskLogs.PreviousTaskLotLogID, TaskLogs.TaskQuantity, 0 as Level FROM TaskLotLogs Join TaskLogs ON TaskLotLogs.TaskLotLogID = TaskLogs.TaskLotLogID WHERE TaskLotLogs.TaskLotLogID = 1497 UNION ALL SELECT JoinedTaskLotLog.*, LOG_CTE. Level + 1 AS Level FROM ( SELECT TaskLotLogs.*, TaskLogs.TaskLogID, TaskLogs.TaskID, TaskLogs.TaskType, TaskLogs.PreviousTaskLotLogID, TaskLogs.TaskQuantity FROM TaskLotLogs JOIN TaskLogs On TaskLotLogs.TaskLotLogID = TaskLogs.TaskLotLogID ) AS JoinedTaskLotLog JOIN LOG_CTE ON JoinedTaskLotLog.PreviousTaskLotLogID = LOG_CTE.TaskLotLogID ) SELECT * FROM LOG_CTE ORDER BY Level |
TaskLotLogs 테이블 데이터가 셀프 참조하는 경우가 있어 무한루프에 빠집니다.
그래서 아래와 JOIN 절 다음에 재귀 탈출 조건을 추가하려했는데...
1 2 3 | JOIN LOG_CTE ON JoinedTaskLotLog.PreviousTaskLotLogID = LOG_CTE.TaskLotLogID WHERE JoinedTaskLotLog.TaskLogID not in ( select TaskLogID from LOG_CTE) |
그런데 MSSQL 재귀쿼리에서는 서브쿼리를 지원하지 않아서...
어떻게 해결해야할지 감이 오질 않네요. 어떤식으로 접근을 하면 되는지 도움좀 부탁드리겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | WITH JoinedTaskLotLog AS ( SELECT a.* , b.TaskLogID , b.TaskID , b.TaskType , b.PreviousTaskLotLogID , b.TaskQuantity , 0 AS Level FROM TaskLotLogs a INNER JOIN TaskLogs b ON a.TaskLotLogID = b.TaskLotLogID ) , log_cte AS ( SELECT a.* , 0 AS Level , CAST (CONCAT( '-' , TaskLotLogID, '-' ) AS VARCHAR (999)) v_path FROM JoinedTaskLotLog a WHERE TaskLotLogID = 1497 UNION ALL SELECT a.* , b. Level + 1 AS Level , CONCAT(b.v_path, a.TaskLotLogID, ',' ) v_path FROM JoinedTaskLotLog a INNER JOIN log_cte b ON a.PreviousTaskLotLogID = b.TaskLotLogID WHERE CHARINDEX(CONCAT( '-' , TaskLotLogID, '-' ), b.v_path, 1) = 0 ) SELECT * FROM log_cte ; |