Oracle Formatter에 대한 두꺼비의 조언
문제
경고는 무엇을 의미합니까?
두 번째 예제가 첫 번째 예보다 더 나빠진 이유는 무엇입니까?
SELECT product_id, prod.name name, sample_id
FROM lims.sample JOIN lims.product prod USING (product_id)
vs.
SELECT product_id, prod.name name, sample_id
FROM (SELECT sample_id, product_id FROM lims.sample)
JOIN lims.product prod
/* ADVICE: [131] This item has not been declared, or it refers to a label */
USING (product_id)
/* ADVICE:
ADVICE SUMMARY
Count Recommendation
----- --------------
1 [131] This item has not been declared, or it refers to a label
The Oracle equivalent error messages are PLS-00320 and
PLS-0321.
*/
참고 : 두 쿼리는 모두 잘 실행되며 동일한 결과를 반환합니다.
해결책
테이블의 데이터, 인덱스 및 수집 통계량을 제쳐두고; 일반적으로 미확인 하위 쿼리 ~해야 한다 중첩 하위 쿼리보다 성능이 뛰어납니다.
다른 팁
내 추측 : Toad가 Oracle과 같은 방식으로 쿼리를 구문 분석하지 않는 것처럼 보입니다.
첫 번째 쿼리에서 아마도 두꺼비는 lims.sample 및 lims.product에 대한 테이블 정의를 확인하고 두 가지 모두에서 "product_id"열을 찾으므로 괜찮습니다.
두 번째 쿼리에서 Toad는 중첩 된 쿼리이기 때문에 조인의 첫 번째 부분에 대한 테이블 정의를 확인할 수 없습니다. 따라서 아마도 그것은 당신 에게이 조언을 포기하고 당신에게 제공합니다 (이것이 조언이 "... 또는 아마도 코파트 인 레이블을 언급하는 이유입니다).
나는이 사례의 조언을 무시하고, 특히 그것이 잘 실행되고 동일한 결과를 반환하기 때문에 무시할 것입니다.
단지 추측이지만 두 번째 쿼리에서 하위 쿼리는 이름이 없습니다. 별명을주십시오. 예를 들어:
SELECT product_id, prod.name name, sample_id
FROM (SELECT sample_id, product_id FROM lims.sample) samp
JOIN lims.product prod
USING (product_id)
제휴하지 않습니다 StackOverflow