2016-10-13 2 views
0

조인 작업에 하위 쿼리를 사용하고 있습니다. 매개 변수를 하드 코딩하면 문제가 해결됩니다. 그러나 이러한 매개 변수는 상관 쿼리라고하는 외부 SQL에서 가져와야합니다. 테이블 별칭을 사용하여 전달하려고하지만 invalid identifier이 결과입니다.Oracle 상관 관계 부속 쿼리 조인에서 별칭을 사용하는 방법은 무엇입니까?

SELECT 
    PR.PROVINCE_NAME 
    ,CO.COUNTRY_NAME 
FROM 
    PROVINCE PR 
    JOIN (
     SELECT COUNTRY_ID, COUNTRY_NAME 
     FROM COUNTRY 
     WHERE COUNTRY_ID=PR.COUNTRY_ID 
    ) CO ON CO.COUNTRY_ID=PR.COUNTRY_ID 
WHERE 
    PR.PROVINCE_ID IN (1,2) 

이에 입력, 그래서 내가 여기에 구문 문제를 도입하지 않은 희망 :

는 질문의 목적을 위해을 발명했다. 질문은 WHERE 절 다음에 구체적으로 COUNTRY_ID=PR.COUNTRY_ID입니다. 이러한 하위 쿼리에서 별칭이 합법적입니까?

+0

음 :

다음 법적 'WHERE COUNTRY_ID = PR.COUNTRY_ID'와'WHERE COUNTRY_ID = 123'을 사용하면 모든 것이 잘 동작합니다. Oracle SQL Developer 버전 3.2.09를 통해이 쿼리를 실행하는 것과 관련이 있습니까? – user6651485

답변

0

두 개의 다른 위치에서 별칭을 사용하고 있습니다. 파생 테이블

SELECT pr.province_name, co.country_name 
FROM province pr 
    JOIN (
    SELECT country_id, country_name 
    FROM country 
    WHERE country_id = pr.country_id --<< this reference to the outer table/alias is invalid 
) co ON co.country_id = pr.country_id -- this is valid 
WHERE pr.province_id IN (1,2) 
A (표준)와

조인 내측 외부 SELECT로부터 별명 또는 테이블에 액세스 할 수없는 선택 : 하나는 다른 것이 아니며, 법적. "유효하지 않은 식별자"는 줄 WHERE country_id = pr.country_id에 의한 것입니다.

JOIN 조건이 주어지면 결과를 변경하지 않고 안전하게 제거 할 수 있습니다. 오라클 옵티마이 저는 파생 테이블에 조건을 넣을만큼 똑똑합니다. 옵티마이에 쿼리를 다시 작성합니다 사실

:

SELECT pr.province_name, co.country_name 
FROM province pr 
    JOIN country co ON co.country_id = pr.country_id 
WHERE pr.province_id IN (1,2); 

그러나 파생 테이블의 외부 쿼리에서 테이블 (또는 별칭)에 액세스하는 방법이 있습니다 : 그것은 측면을 불렀다 가입하십시오.

이것은 SQL 표준의 일부이지만, 당신이 그것을 사용할 수 있도록하기 위해 오라클 (12)이 필요합니다 최대한 빨리 교체로,

SELECT pr.province_name,co.country_name 
FROM province pr 
    JOIN LATERAL (
     SELECT country_id, country_name 
     FROM country 
     WHERE country_id = pr.country_id 
    ) co ON co.country_id = pr.country_id 
WHERE pr.province_id IN (1,2)
+0

확인. 그래서 간단합니다. 나는 LATERAL을 받아들이지 않는 11.2 버전을 사용하고있다. 또한, 나는 그 질문의 목적을 위해 나의 모범을 발명했으며 당신이 제안한 것처럼 내 질문을 다시 쓸 수는 없다. 이유는 그 조인에서 여러 행을 얻고 suquery는 내가 필요한 단일 행으로 줄일 수 있다는 것입니다. 신속한 대응에 감사드립니다. – user6651485