where 절에서 별명을 사용합니다
문제
최근에 충분히 업데이트되지 않은 표 A의 행을 보여줄 수있는 쿼리가 있습니다. (각 행은 "Month_no"후 2 개월 이내에 업데이트되어야합니다.) : :) :
SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B
WHERE A.identifier = B.identifier
AND MONTH_NO > UPD_DATE
WHERE 절의 마지막 줄은 "ORA-00904 잘못된 식별자"오류를 유발합니다. 말할 것도없이, 나는 WHERE 절에서 전체 디코드 함수를 반복하고 싶지 않습니다. 이견있는 사람? (수정 및 해결 방법이 모두 허용됩니다 ...)
해결책
연대순으로 발생하기 때문에 이것은 직접 불가능합니다. ~ 전에 항상 실행 체인의 마지막 단계 인 SELECT.
하위 선택 및 필터를 수행 할 수 있습니다.
SELECT * FROM
(
SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B
WHERE A.identifier = B.identifier
) AS inner_table
WHERE
MONTH_NO > UPD_DATE
흥미로운 정보는 주석에서 올라갔습니다.
성능이 없어야합니다. Oracle은 외부 조건을 적용하기 전에 내부 쿼리를 구체화 할 필요가 없습니다. Oracle 은이 쿼리를 내부적으로 변환하고 술어를 내부 쿼리로 밀어 내고 비용 효율적인 경우 그렇게합니다. - 저스틴 동굴
다른 팁
SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A, table_b B
WHERE .identifier = B.identifier
HAVING MONTH_NO > UPD_DATE
또는 a에서 별명을 가질 수 있습니다 HAVING
절
대안적인 접근 방식이 할 수있는 것처럼 :
WITH inner_table AS
(SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B
WHERE A.identifier = B.identifier)
SELECT * FROM inner_table
WHERE MONTH_NO > UPD_DATE
또한 대기열에 대한 영구보기를 만들고보기에서 선택할 수 있습니다.
CREATE OR REPLACE VIEW_1 AS (SELECT ...);
SELECT * FROM VIEW_1;
Select, Where 및 기타 조항 모두에서 사용할 수있는 변수를 효과적으로 정의 할 수 있습니다.
하위 쿼리가 반드시 참조 된 테이블 열에 적절한 바인딩을 허용하지는 않지만 외부 적용이 가능합니다.
SELECT A.identifier
, A.name
, vars.MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B ON A.identifier = B.identifier
OUTER APPLY (
SELECT
-- variables
MONTH_NO = TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL))
) vars
WHERE vars.MONTH_NO > UPD_DATE
kudos to Syed Mehroz Alam.
제휴하지 않습니다 StackOverflow