2010-12-15 3 views
2

의 다음 I가 있다고 가정 해 봅시다 :오라클은 subquery와 상수 결과를 비교하는 where 절 조건을 어떻게 처리합니까?

select primary_id 
from myschema.table_a 
where row_changed_date > (select last_refreshed 
          from myschema.last_refresh lr 
          where asset_type = 0); 

서브 쿼리의 결과는 자산 사이에 변경되지 않습니다. 난 기술적으로 직접 상수 값과 비교하고 싶지만, 상수를 얻기 위해 별도의 쿼리를 실행하고 싶지는 않습니다. Oracle은 반복을 통해 각 단계마다 하위 쿼리를 실행합니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

3

당신은 당신의 하위 쿼리가 하나의 행을 반환 보장, 또는 자격을 갖춘 비교를 사용할 필요가 서브 쿼리를 한 번 계산합니다. 실제로 table_a 테이블의 열이면 상관 된 하위 쿼리가 있습니다. 그것은 행마다 평가되어야합니다.

이 답변은 실제로 DBMS에 독립적입니다.이 규칙은 다른 SQL DBMS뿐만 아니라 Oracle에도 적용됩니다.

+0

예, 서브 테이블의 열에 해당 테이블 별칭을 추가하는 것이 안전합니다. –

1

예제에서 하위 쿼리 - 아니요를 사용하면 Oracle은 모든 행에 대해 하위 쿼리를 실행하지 않습니다. 그러나 상관 관계가있는 하위 쿼리가 발생합니다.

사용 :

때문에 내부 조인 사용
SELECT a.primary_id 
    FROM MYSCHEMA.TABLE_A a 
    JOIN MYSCHEMA.LAST_REFRESH lr ON lr.last_refreshed < a.row_changed_date 
WHERE lr.asset_type = 0 

가 쿼리의 다음 버전 중 하나를 사이에 결과의 차이이나 성능이 없다 : WHERE 사용

SELECT a.primary_id 
    FROM MYSCHEMA.TABLE_A a 
    JOIN MYSCHEMA.LAST_REFRESH lr ON lr.last_refreshed < a.row_changed_date 
           AND lr.asset_type = 0 

대체 버전. OUTER JOINS (LEFT, RIGHT)를 사용하는 경우에는 그렇지 않습니다. 열이 나서, last_refresh 테이블에 오라클입니다

WHERE row_changed_date > (SELECT MAX(last_refreshed) ...) 

asset_type 가정 :

WHERE row_changed_date > ALL (SELECT last_refreshed ...) 

또는 :