2013-02-27 18 views
0

다음 쿼리를 조인으로 다시 작성하려면 어떻게합니까? 나는 그것을 다시 작성하는 것이 더 잘 수행 될 것이라고 생각한다. (나는 이론화하고있다.) 그러나 나는 합류하기가 힘들다. 어떤 도움이라도 대단히 감사합니다.자체에 대한 하위 쿼리를 조인으로 사용하는 쿼리를 다시 작성하는 방법

SELECT O.JOBNUM, O.JOBNAME, O.STARTTS, 
(SELECT 
    MIN(I.STARTTS) 
FROM TABLE1 AS I 
WHERE 
    I.STARTTS > O.STARTTS AND 
    I.JOBNAME = O.JOBNAME) 
AS ENDTS 
FROM TABLE1 AS O; 

기본적으로 위의 쿼리는 주어진 작업 인스턴스의 ENDTS를 검색하는 데 사용됩니다. ENDTS는 저장되지 않고 동일한 태스크가 루프에서 실행될 때 자동으로 계산되므로 주어진 태스크의 ENDTS는 다시 실행될 때 같은 태스크 (이름으로 식별 됨)의 STARTTS입니다. 작업이 아직 실행되지 않으면 ENDTS에 NULL이 적합합니다.

미리 도움을 주셔서 감사합니다. 당신이 JOIN으로이를 다시 작성하려면

+0

내가 왼쪽 오른쪽 솔루션에 가입 확실하지 않다. 단순히 쿼리 최적화 문제 일 수 있습니다. 시작과 작업 이름에 대한 색인이 있습니까? – Narnian

+1

안쪽과 바깥 쪽의 키워드는 가능한 한 많이 테이블/열로 사용하지 마십시오. – wildplasser

+0

@Narnian. 네. 나는 인덱스를 가지고 있지만 아래에 제안 된 bluefeet이 더 잘 수행하는 참여가 있습니다. – Azeem

답변

0

, 당신은 사용할 수 있습니다

SELECT o.JOBNUM, 
    o.JOBNAME, 
    o.STARTTS, 
    MIN(i.STARTTS) ENDTS 
FROM TABLE1 AS o 
LEFT JOIN TABLE1 AS i 
    ON i.STARTTS > o.STARTTS 
    AND i.JOBNAME = o.JOBNAME 
GROUP BY o.JOBNUM, o.JOBNAME, o.STARTTS; 
+0

감사합니다 bluefeet. 이것은 훌륭하고 잘 작동합니다. ENDTS에 WHERE 절을 추가하면 STARTTS 인덱스를 사용하는 대신 테이블 스캔이 발생합니다. 이 문제를 해결할 방법이 있는지 알고 있습니까? 내가 subselect뿐만 아니라 원래의 쿼리와 동일한 문제가 있습니다. – Azeem

+0

사실, 지금 나에게 의미가 있습니다. where 절에 ENDTS를 추가하면 테이블 스캔이 필요하지만 JOBNAME 또는 STARTS도 추가하면 전체 테이블 스캔을 수행 할 수 없습니다. 내가 아는 바로는 인덱스에서 ENDTS에 대한 뷰를 만들 수 없습니다 (SQL 서버에서는 가능하지만 DB2에서는 불가능하다고 생각합니다). – Azeem

+0

@Azeem 불행히도 저는 DB2에 익숙하지 않았습니다. – Taryn

관련 문제