2013-02-23 2 views
0
Error report: 
ORA-00904: "RDD"."USED_END_DATE": invalid identifier 
ORA-02063: preceding line from ADSWEBPROD 
ORA-06512: at line 5 

다음 쿼리는 잘못된 식별자 오류를 던지고 있습니다.Oracle 유효하지 않은 식별자

DECLARE 
    TYPE demo_date_array_type IS TABLE OF dc_demo_dates.demo_date_id%TYPE; 
    updated_demo_dates demo_date_array_type; 
BEGIN 
    SELECT ddd.demo_date_id 
    BULK COLLECT INTO 
    updated_demo_dates 
    FROM 
    dc_demo_dates ddd 
    JOIN 
    dc_demo_reservations ddr 
    ON 
    ddd.reservation_id = ddr.reservation_id 
    AND ddr.status NOT IN ('DENIED','CANCELLED') 
    AND ddr.demo_type <> 'Training' 
    AND ddr.environment IS NOT NULL 
    AND ddd.last_update_date > SYSTIMESTAMP - 1   -- updated in the last day 
    AND ddd.demo_start_date > SYSTIMESTAMP - 14 -- no older than 2 weeks 
    JOIN 
    (SELECT demo_date_id, used_start_date, used_end_date 
    FROM rps_by_demo_date 
    GROUP BY demo_date_id, used_start_date, used_end_date) rdd 
    ON rdd.demo_date_id = ddd.demo_date_id 
    WHERE 
    ddd.demo_start_date != NVL(rdd.used_start_date, SYSTIMESTAMP) -- either start date 
    OR ddd.demo_end_date != NVL(rdd.used_end_date, SYSTIMESTAMP); -- or end date has changed 
END; 

나는 제거하면 GROUP BY demo_date_id, used_start_date, used_end_date 또는 내가 AND의 마지막 OR을 변경하는 경우

당신이 무엇을 할 수 아십니까 (그것이 나에게 내가 원하는 결과를 제공하지 않습니다 제외), 코드는 성공적으로 실행 계속 하시겠습니까? 감사합니다.

편집 : 하위 쿼리에서 group by 절을 기본 쿼리로 이동하고 원하는 결과를 얻었습니다. 하지만 여전히 오류의 원인을 이해하지 못합니다.

DECLARE 
    TYPE demo_date_array_type IS TABLE OF dc_demo_dates.demo_date_id%TYPE; 
    updated_demo_dates demo_date_array_type; 
BEGIN 
    SELECT ddd.demo_date_id 
    BULK COLLECT INTO 
    updated_demo_dates 
    FROM 
    dc_demo_dates ddd 
    JOIN 
    dc_demo_reservations ddr 
    ON 
    ddd.reservation_id = ddr.reservation_id 
    AND ddr.status NOT IN ('DENIED','CANCELLED') 
    AND ddr.demo_type <> 'Training' 
    AND ddr.environment IS NOT NULL 
    AND ddd.last_update_date > SYSTIMESTAMP - 1   -- updated in the last day 
    AND ddd.demo_start_date > SYSTIMESTAMP - 14 -- no older than 2 weeks 
    JOIN 
    (SELECT demo_date_id, used_start_date, used_end_date 
    FROM rps_by_demo_date 
    GROUP BY demo_date_id, used_start_date, used_end_date) rdd 
    ON rdd.demo_date_id = ddd.demo_date_id 
    AND (ddd.demo_start_date != NVL(rdd.used_start_date, SYSTIMESTAMP) 
    OR ddd.demo_end_date != NVL(rdd.used_end_date, SYSTIMESTAMP)); 
END; 

내가 조인 상태로 where 절을 이동 한 - :

+0

'group by'에서'used_end_date'만을 제거합니다. – alfasin

+0

'group by'에서'used_end_date'를 제거하면'select'에서 사용할 수 없습니다; 'select'에서 제거하면'where'에서 사용할 수 없습니다. – Arzaquel

+0

은'demo_date_id, used_start_date, used_end_date' (같은 값)의 중복 행을 가지고있는 것처럼 들리므로 어쩌면'DISTINCT' 값만 가져 오려고해야할까요? – alfasin

답변

0

이 시도. 조인 조작에 where 절을 사용하면 예기치 않은 결과가 발생할 수 있습니다. where 절이 rdd를 인식하지 못할 수도 있습니다. 그러나 조인 조건에서이를 인식 할 수 있습니다.

+0

제안 해 주셔서 감사합니다. 시도해 보았지만 여전히 동일한 오류가 발생했습니다. 'ORA-00904 : "RDD". "USED_END_DATE": 잘못된 식별자 ORA-02063 : ADSWEBPROD의 선행 ORA-06512 : at line 5' – Arzaquel

+0

또한 첫 번째 쿼리와 마찬가지로 OR을 AND로 변경하고 AND로 실행하면 오류없이 실행됩니다. / – Arzaquel

관련 문제