문제

최근에 충분히 업데이트되지 않은 표 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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top