오라클 쿼리에 도움이 필요합니다. 내가 "작업"및 "작업 표"각각라는 두 테이블이함께 섞어서 연결하십시오, 내부 조인 및 Oracle 합계
:
여기 내 설정입니다. "tasks"테이블은 재귀 적 테이블이며, 각 태스크는 여러 하위 작업을 가질 수 있습니다. 각 작업 표는 작업 (반드시 "루트"작업 일 필요는 없음)과 연결되어 있으며 작업 한 시간 수를 포함합니다.
예 :
작업
ID : 1 | 이름 : 작업 A | parent_id : NULL
id : 2 | 이름 : 작업 A1 | parent_id : 1
id : 3 | 이름 : 작업 A1.1 | parent_id : 2
ID : 4 | 이름 : 작업 B | parent_id : NULL
ID : 5 | 이름 : 작업 B1 | parent_id : 4
출퇴근 시간 기록 용지
ID : 1 | task_id : 1 | 시간 : 1
ID : 2 | task_id : 2 | 시간 : 3
ID : 3 | task_id : 3 | 시간 : 1
ID : 5 | task_id : 5 | 시간 : 1 ...
내가하고 싶은 :나는 "작업 계층 구조"에 근무하는 모든 시간의 합을 반환하는 쿼리를합니다. 앞의 예제를 살펴보면 다음과 같은 결과를 얻고 싶습니다.
작업 A - 5 시간 | 작업 B - 1시간 (들) 처음에는
나는이
SELECT TaskName, Sum(Hours) "TotalHours"
FROM (
SELECT replace(sys_connect_by_path(decode(level, 1, t.name), '~'), '~') As TaskName,
ts.hours as hours
FROM tasks t INNER JOIN timesheets ts ON t.id=ts.task_id
START WITH PARENTOID=-1
CONNECT BY PRIOR t.id = t.parent_id
)
GROUP BY TaskName Having Sum(Hours) > 0 ORDER BY TaskName
을 시도하고 거의 작동합니다. 문제는 루트 태스크에 대한 작업 표가 없으면 전체 히스토리를 건너 뛸 수 있지만 자식 행에 대한 작업 표가있을 수 있으며 작업 B1에서 발생하는 작업과 정확히 일치한다는 것입니다. 내 문제의 원인이되는 것이 "내부 결합"부분 인 것을 알고 있지만 어떻게 제거 할 수 있는지 잘 모르겠습니다.
이 아이디어를 어떻게 해결할 수 있습니까?
고맙습니다.
테이블의 순서를 바꾸고 왼쪽 외부 조인을 사용하면 시간 시트가 없을 때도 작업을 수행 할 수 있다고 생각합니다. 어쩌면 그럴 수 있을까요? – FrustratedWithFormsDesigner
도움 주셔서 감사합니다. 필자의 경우 왼쪽 조인을 수행하면 테이블이 잘 색인화되어 있지만 모든 주요 성능 문제가 발생합니다. –