복붙노트

[SQL] WHERE 절에 별칭을 사용하여

SQL

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 절에 전체 DECODE 함수를 반복하고 싶지 않아요. 이견있는 사람? (수정 및 해결 방법 모두 가능 ...)

해결법

  1. ==============================

    1.연대순으로, WHERE 항상 실행 체인의 마지막 단계입니다 SELECT, 전에 발생하기 때문에, 직접 수 없습니다.

    연대순으로, 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
    

    정보의 흥미로운 비트는 의견에서 최대 이동 :

  2. ==============================

    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 .identifier = B.identifier
    HAVING MONTH_NO > UPD_DATE
    
  3. ==============================

    3.또는 당신은 HAVING 절에 별칭을 가질 수 있습니다

    또는 당신은 HAVING 절에 별칭을 가질 수 있습니다

  4. ==============================

    4.그냥 당신에 대한 대안 접근 할 수있는 등 :

    그냥 당신에 대한 대안 접근 할 수있는 등 :

    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;
    
  5. ==============================

    5.그것은 효과적으로 선택하고 다른 조항에서 모두 사용할 수있는 변수를 정의 할 수 있습니다.

    그것은 효과적으로 선택하고 다른 조항에서 모두 사용할 수있는 변수를 정의 할 수 있습니다.

    서브 쿼리는 반드시 그러나 외부 적용 해, 참조 된 테이블의 컬럼에 바인딩 적절한 허용하지 않습니다.

    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
    

    에드 Mehroz 알람 했네.

  6. from https://stackoverflow.com/questions/356675/using-an-alias-in-a-where-clause by cc-by-sa and MIT license